首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2010 求后序遍历

2010 求后序遍历

作者头像
attack
发布2018-04-12 15:46:47
5510
发布2018-04-12 15:46:47
举报

2010 求后序遍历

时间限制: 1 s

空间限制: 64000 KB

题目等级 : 白银 Silver

题目描述 Description

输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。

输入描述 Input Description

共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。

输出描述 Output Description

仅一行,表示树的后序遍历序列。

样例输入 Sample Input

abdehicfg

dbheiafcg

样例输出 Sample Output

dhiebfgca

数据范围及提示 Data Size & Hint

输入长度不大于255。

分类标签 Tags 点此展开
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 string s1,s2;
 6 void calc(int l1,int r1,int l2,int r2)
 7 {
 8     int m=s2.find(s1[l1]);
 9     if(m>l2) //当m=l2 时 说明左子树只含有一个元素, 
10     calc(l1+1,l1+m-l2,l2,m-1);// 前半部分是先序遍历 后半部分是中序遍历 
11     if(m<r2)// 同理,右子树只含有一个元素 
12     calc(l1+m-l2+1,r1,m+1,r2);
13     cout<<s1[l1];//巧妙利用后序遍历最后输出节点的性质 
14 }
15 int main()
16 {
17     cin>>s1>>s2;
18     calc(0,s1.length()-1,0,s2.length()-1);
19     return 0;
20 }
21 //前序遍历的每个分块的第一个值为根节点,我从中序遍历里找到其相应位置,
22 //之前即为左子树的范围,之后为右子树的范围
23 // if (k > l2) solve(l1+1,l1+k-l2,l2,k-1);  
24 //判断条件是当找到了最底层的节点的时候就不做了(此时k=l2)
25 //l1+1:下一个左子树最开头的节点的位置,l1-k+l2:通过中序遍历求出左子树的范围进而找到左子树最后一个节点的位置
26 // if (k < r2) solve(l1+k-l2+1,r1,k+1,r2);
27 //l1+k-l2+1:紧接着右子树第一个节点也就是根节点的位置(l1+k-l2是左子树最后一个节点的位置,加一即为右子树第一个节点)
28 // cout << first[l1];   //因为求后序遍历所以递归调用最后才输出根节点的值
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2010 求后序遍历
    • 分类标签 Tags 点此展开
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档