题目链接: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 举报,一经查实,本站将立刻删除。