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

HDU 1710 Binary Tree Traversals

时间:2015-03-12 20:44:23      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历

 

首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树

前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗树的根节点,

然后拆分出左右子树,对左右子树进行相同的操作,也就是将建树的这个函数递归调用下去

 

build函数还是理解了好久啊话说= =仍然是学习的代码

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath>   
 5 #include<algorithm>  
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 const int maxn=1005;
10 
11 void build(int n,int *s1,int *s2,int *s){
12     if(n<=0) return;
13     int p;
14     for(int i=0;i<n;i++){
15         if(s2[i]==s1[0]){
16             p=i;//在中序遍历中找到根结点的位置 
17             break;
18         }
19     }
20     
21     build(p,s1+1,s2,s);//p为左子树的区间长度,s1+1是在前序遍历中左子树的开头,s2是在中序遍历中左子树的开头 
22     build(n-p-1,s1+p+1,s2+p+1,s+p);//n-p-1为右子树的区间长度,s1+p+1 是在前序遍历中右子树的开头,s2是在中序遍历中右子树的开头 
23     s[n-1]=s1[0];
24 }
25 
26 int main()
27 {
28     int n,i,ans[maxn],s1[maxn],s2[maxn];
29     while(scanf("%d",&n)!=EOF){
30         for(i=0;i<n;i++) scanf("%d",&s1[i]);
31         for(i=0;i<n;i++) scanf("%d",&s2[i]);
32         build(n,s1,s2,ans);
33         for(i=0;i<n-1;i++) printf("%d ",ans[i]);
34         printf("%d\n",ans[i]);
35     }
36     return 0;
37 }
View Code

 

HDU 1710 Binary Tree Traversals

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4333302.html

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