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

Tree-UVA 548

时间:2018-10-29 02:05:01      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:完整   bool   clear   summary   二叉树   config   dfs   blank   div   

1.题目描述:点击链接

2.问题分析:

题目已经给出了某二叉树经过中序遍历和后序遍历得到的节点顺序,要求通过这些节点的值以及顺序,找到原有的二叉树以及到根节点最近的叶子节点。

我认为最主要的是找到后序遍历和中序遍历得到的节点顺序有什么规律

我们知道,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树,而后序遍历首先遍历左子树,然后遍历右子树,最后访问根节点。所以由此我们不难得出以下几个结论:

(1)中序遍历的左子树和右子树分布于根节点的两侧。

(2)后序遍历最后一个值一定是根节点,

(3)这两种遍历方法都是可以使用递归,任何一个左子树和右子树都可以看成另外一颗完整的二叉树

3.算法步骤:

(1)通过后序遍历给的值找到根节点,在利用找到的根节点在中序遍历给的值中找到左子树和右子树

(2)通过递归,还原出完整的二叉树

(3)使用DFS找到路径最短的路线

4.ac代码:

 1 #include<iostream>
 2 #include<string>
 3 #include<stdlib.h>
 4 #include<sstream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn=10000+10;
 8 int in_order[maxn],post_order[maxn],lch[maxn],rch[maxn];
 9 int n;
10 bool read_list(int *a){
11     string line;
12     if(!getline(cin,line))return false;
13     stringstream ss(line);
14     n=0;
15     int x;
16     while(ss>>x)a[n++]=x;
17     return n>0;
18 }
19 int build(int L1,int R1,int L2,int R2){//建二叉树,返回树根
20     if(L1>R1)return 0;//空树
21     int root=post_order[R2];
22     int p=L1;
23     while(in_order[p]!=root)p++;
24     int cnt=p-L1;//左子树的节点个数
25     cout<<"L1,p-1,L2,L2+cnt-1"<<endl;
26     cout<<L1<<" "<<p-1<<" "<<L2<<" "<<L2+cnt-1<<endl;
27 
28     lch[root]=build(L1,p-1,L2,L2+cnt-1);
29     
30     cout<<"lch["<<root<<"]="<<lch[root]<<endl;
31     cout<<"p+1,R1,L2+cnt,R2-1"<<endl;
32     cout<<p+1<<" "<<R1<<" "<<L2+cnt<<" "<<R2-1<<endl;
33     
34     rch[root]=build(p+1,R1,L2+cnt,R2-1);
35     
36     cout<<"rch["<<root<<"]="<<rch[root]<<endl;
37     return root;  
38 }
39 int best,best_sum;
40 void dfs(int u,int sum){
41     sum+=u;
42     if(!lch[u]&&!rch[u]){
43         if(sum<best_sum||(sum==best_sum&&u<best)){best=u;best_sum=sum;}
44     }
45     if(lch[u])dfs(lch[u],sum);
46     if(rch[u])dfs(rch[u],sum);
47 }
48 int main(){
49     //freopen("in.txt","r",stdin);
50     while(read_list(in_order)){
51         read_list(post_order);
52         build(0,n-1,0,n-1);
53         best_sum=1000000000;
54         dfs(post_order[n-1],0);
55         cout<<best<<"\n";
56     }
57     return 0;
58 }

 

 

 
 

Tree-UVA 548

标签:完整   bool   clear   summary   二叉树   config   dfs   blank   div   

原文地址:https://www.cnblogs.com/bo2000/p/9868137.html

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