题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710

解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在

中序中找到这个结点, 则这个结点左边的节点属于左子树, 右边的属于右子树。然后递归遍历就可以了。
样例:
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
 
7 4 2 8 9 5 6 3 1
如图:
 
因此,用深搜就能轻松解决了,注意DFS中的变量,以及向清楚DFS的条件,这题就简单多了,具体看代码吧:
#include<iostream>
#include<string.h>
#include<cstdio>
#include<stack>
using namespace std;
#define maxn 1001
int m,n,a[maxn],b[maxn]; //先序数组和后序数组
stack<int>Q; //存放父节点
void dfs(int l1,int r1,int l2,int r2)
{//l1,r1,是先序遍历的数组的开始和末尾,l2,r2是中序遍历的数组的开始和末尾
int i,j;
Q.push(a[l1]); //父节点入栈
for(i=l2;i<=r2;i++)
if(b[i]==a[l1]) break;
//i 父节点在中序遍历的位置,j 左子树和右子树在先序遍历的分界点,即右子树的父节点
j=l1+(i-l2+);
if(j<=r1&&i-<=r2) dfs(j,r1,i+,r2); //求解右子树
if(l1+<=j-&&l2<=i-) dfs(l1+,j-,l2,i-); //求解左子树
//不能换位置,根据输出的后序遍历图可以看出,栈的后方为右半部分
}
int main()
{
while(cin>>n)
{
for(int i=;i<n;i++) scanf("%d",&a[i]);
for(int i=;i<n;i++) scanf("%d",&b[i]);
dfs(,n-,,n-);
while(!Q.empty())
{
printf("%d",Q.top());
Q.pop();
if(Q.size()) printf(" ");
}
cout<<endl;
}
return ;
}
 

HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)的更多相关文章

  1. HLG2040二叉树遍历已知前中,求后

    二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 us ...

  2. HDU 1710 二叉树遍历,输入前、中序求后序

    1.HDU  1710  Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...

  3. HDU 1710-Binary Tree Traversals(二进制重建)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. Tree Recovery(前序中序求后序)

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14640   Accepted: 9091 De ...

  5. c++树,知道前序和中序求后序遍历

    经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依 ...

  6. PAT (Advanced Level) 1136~1139:1136模拟 1137模拟 1138 前序中序求后序 1139模拟

    1136 A Delayed Palindrome(20 分) 题意:给定字符串A,判断A是否是回文串.若不是,则将A反转得到B,A和B相加得C,若C是回文串,则A被称为a delayed palin ...

  7. python实现根据前序与中序求后序

    我就不板门弄斧了求后序 class Tree(): def __init__(self,x): self.value=x self.left=None self.right=None class So ...

  8. UVa 二叉树重建(先序+中序求后序)

    题意是给出先序和中序,求出后序. 先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中.因为后序遍历先 ...

  9. 【美国血统 American Heritage 题解】已知前序中序 求后序

    题目: 题目名称:美国血统 American Heritage 题目来源:美国血统 American Heritage ## 题目描述 农夫约翰非常认真地对待他的奶牛们的血统.然而他不是一个真正优秀的 ...

随机推荐

  1. iOS.ObjC.Basic-Knowledge

    1. ObjC的基础 2. ObjC2.0中的编译指令 3. ObjC Runtime 4. ObjC Object Model 5. ObjC的新语法 6. FQA 1. ObjC的基础 2. Ob ...

  2. Silverlight StoryBoard 动态切换ImageSource

    Silverlight StoryBoard 动态切换ImageSource <StackPanel Grid.Row="1" Orientation="Horiz ...

  3. 20155317 王新玮 2016-2017-2 《Java程序设计》第9周学习总结

    20155317 王新玮 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以 ...

  4. 2018.07.03 POJ 2653 Pick-up sticks(简单计算几何)

    Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Description Stan has n sticks of various leng ...

  5. 2018.08.30 花园(期望dp)

    题目背景 SCOI2017 DAY2 T1 题目描述 小 A 的花园的长和宽分别是 L,H .小 A 喜欢在花园里做游戏.每次做游戏的时候,他都先把花园均匀分割成 L×H 个小方块,每个方块的长和宽都 ...

  6. Django入门与实践-第12章:复用模板(完结)

    http://127.0.0.1:8000/http://127.0.0.1:8000/boards/1/http://127.0.0.1:8000/boards/2/http://127.0.0.1 ...

  7. UVaLive 2796 Concert Hall Scheduling (最小费用流)

    题意:个著名的音乐厅因为财务状况恶化快要破产,你临危受命,试图通过管理的手段来拯救它,方法之一就是优化演出安排,既聪明的决定接受或拒绝哪些乐团的演出申请,使得音乐厅的收益最大化.该音乐厅有两个完全相同 ...

  8. HDU 4562 守护雅典娜 (计算几何+DP)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  9. webuploader 文件上传总结

    $(function() { /** * 初始化Web Uploader */ var uploader = WebUploader.create({ swf : '../mobile/Uploade ...

  10. 测试mktime和localtime_r性能及优化方法

    // 测试mktime和localtime_r性能及优化方法 // // 编译方法:g++ -g -o x x.cpp或g++ -O2 -o x x.cpp,两种编译方式性能基本相同. // // 结 ...