首页 > 其他 > 详细

【洛谷1030】求先序遍历

时间:2020-01-03 10:52:40      阅读:93      评论:0      收藏:0      [点我收藏+]

原题:

给出一棵二叉树的中序与后序排列。求出它的先序排列。

 

性质:

1.三序遍历的序列中,同一子树的所有节点不留空隙地组成一个区间,即对于任意子树,存在一个区间使得区间内每个点都恰好是子树中的一个节点

2.中序遍历序列中,在一个子树的区间中,子树根节点左边的区间是左子树区间,右边的区间是右子树区间

3.后序遍历序列中,一个子树区间内,子树根节点左边是右子树区间,再左边是左子树区间

4.由上可以推出在某个字数区间中,后序遍历标号最大的节点是根节点

那么可以递归,参数为中序遍历序列中子树的区间端点,每次在子树区间中找到后序遍历标号最大的点,即子树根节点,然后递归处理左右子树区间

 

代码:(题目中不同节点用不同大写字母表示)

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int s[110000],t[110000],n,m;
 5 int iod[110000],pstod[110000];
 6 void gtprod(int l,int r){
 7     if(l>r)  return ;
 8     int mx=0;
 9     for(int i=l;i<=r;++i)if(pstod[s[i]]>pstod[s[mx]])
10         mx=i;
11     printf("%c",s[mx]-1+A);
12     gtprod(l,mx-1),gtprod(mx+1,r);
13 }
14 int main(){
15     n=0,m=0;
16     char ch=getchar();
17     while(ch<A || ch>z)  ch=getchar();
18     while(ch>=A && ch<=Z){
19         s[++n]=ch-A+1;
20         ch=getchar();
21     }
22     while(ch<A || ch>z)  ch=getchar();
23     while(ch>=A && ch<=Z){
24         t[++m]=ch-A+1;
25         ch=getchar();
26     }
27     for(int i=1;i<=n;++i)  iod[s[i]]=i;
28     for(int i=1;i<=n;++i)  pstod[t[i]]=i;
29     gtprod(1,n);
30     return 0;
31 }
View Code

【洛谷1030】求先序遍历

原文:https://www.cnblogs.com/cdcq/p/12143619.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!