ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-21 17:01:15  阅读:185  来源: 互联网

标签:node 左子 后序 int 中序 pta postL L2 序列


题目链接: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 }

 

标签:node,左子,后序,int,中序,pta,postL,L2,序列
来源: https://www.cnblogs.com/LQS-blog/p/16174901.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有