微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pta L2-006 树的遍历根据后序中序确定层序

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456

对树的遍历考的很周到,第一次接触到确定层序序列的题;

题目思路:建树函数和根据前中序序列确定后序序列思想是相同的,但是在细节方面还是存在差异,比如:

 

 我们可以根据题目的要求画个图

拿样例来看:

我们可以确定根节点是后序序列的最后一个数,同时我们也可以确定左右子树的位置和元素的个数还有具体的元素,那我们每次就可以确定左右子树的范围了,同时建立左右子节点的子树,就比如,

左子树的后序序列就是从起始位置到1所在的位置,也就是起始位置加上左子树的元素个数在减去1,左子树的中序序列就是从中序序列的起始位置在到根节点-1的位置,同理:

右子树的后序序列和中序序列所对应的位置也可以推导出来;

那建树的函数解决了;

剩下的层序序列的确定就可以交给层序遍历来确定了

Talk is cheap. Show me the code.

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int in[110];//中序序列 
 5 int post[110];//后序序列 
 6 struct node
 7 {
 8     int value;
 9     node *L;
10     node *R;
11     node(int value=0,node *L=NULL,node *R=NULL):value(value),L(L),R(R){}
12 };
13 node *build_tree(int postL,int postR,int inL,int inR)//左子树的起点,终点,右子树的起点,终点 
14 {
15     if(postL>postR)//后序序列长度<=0 
16     return NULL;//返回错误 
17     node *root=new node;//新建根节点 
18     root->value=post[postR];//后序序列最后一个肯定是根节点 
19     int flag=-1;//在中序序列中查找根节点的位置 
20     for(register int i=inL;i<=inR;i++)
21     {
22         if(in[i]==post[postR])
23         {
24             flag=i;
25             break;
26         }
27     }
28     int numL=flag-inL;//左子树的个数 
29     root->L=build_tree(postL,postL+numL-1,inL,flag-1);//左子树 
30     root->R=build_tree(postL+numL,postR-1,flag+1,inR);//右子树 
31     return root;
32 }
33 int cnt;
34 void bfs(node *root)//层序遍历 
35 {
36     queue<node *>q;
37     q.push(root);
38     while(!q.empty())
39     {
40         node *newroot=q.front();//取出首元素 
41         q.pop();
42         cout<<newroot->value;//访问 
43         cnt++;
44         if(cnt<n)
45         printf(" ");
46         if(newroot->L!=NULL)
47         q.push(newroot->L);
48         if(newroot->R!=NULL)
49         q.push(newroot->R); 
50     }
51 }
52 int main()
53 {
54     scanf("%d",&n);
55     for(register int i=1;i<=n;i++)
56     scanf("%d",&post[i]);
57     for(register int i=1;i<=n;i++)
58     scanf("%d",&in[i]);
59     node *root=build_tree(1,n,1,n);
60     bfs(root);
61     return 0;
62 }

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐