码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder #1049 : 后序遍历

时间:2015-04-26 21:00:01      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

 

题意:提供前序遍历结果,和中序遍历结果。输出后序遍历结果。最多26个节点,即从‘A’~‘Z’。

思路:递归建立树,再递归后续遍历。前序遍历的结果就是做了一次DFS的结果,所以可以从左到右顺序来遍历前序序列,每遇到1个字母就以其为一个节点,建立以它为根的子树,直到该子树建立完成为止。怎么判断所建立的这个节点是叶子节点来断定结束了呢?这要依靠中序序列了,中序中每个字母都能把一段子序列分开两半,左边是左子树,右边是右子树。那么操作在中序序列上,再以前序序列作为辅助。

注:一开始把前序起个名字为prev,结果编译错误,改为pre就过了。

 

技术分享
 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 using namespace std;
 5 string pre, medi;
 6 int point;
 7 struct node
 8 {
 9     char c;
10     node *left;
11     node *right;
12 };
13 
14 node *createnode(char c)
15 {
16     node *p=(node*)new(node);
17     p->left=0;
18     p->right=0;
19     p->c=c;
20     return p;
21 }
22 node* DFS(int a,int cur,int b)    // cur是根。在区间[a,b]中,cur将其分为两棵子树进行递归。
23 {
24     if(a==b)
25         return createnode(medi[cur]);
26     node *p=createnode(medi[cur]);    //先创建当前节点
27     if(cur-a!=0)    //找左孩子
28     {
29         point++;
30         p->left = DFS(a, medi.find(pre[point]), cur-1);
31     }
32     if(b-cur!=0)    //找右孩子
33     {
34         point++;
35         p->right = DFS(cur+1, medi.find(pre[point]), b);
36     }
37     return p;   //返回整个子树
38 }
39 void sao(node *p)   //后续遍历树
40 {
41     if(p->left)
42         sao(p->left);
43     if(p->right)
44         sao(p->right);
45     cout<< p->c ;
46 }
47 int main()
48 {
49     //freopen("input.txt", "r", stdin);
50     cin>> pre>> medi;
51     sao( DFS(0, medi.find(pre[0]), pre.size()-1) );
52     cout<<endl;
53     return 0;
54 }
AC代码

 

hihoCoder #1049 : 后序遍历

标签:

原文地址:http://www.cnblogs.com/xcw0754/p/4458314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!