当前位置:   article > 正文

5-7 树的遍历_给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数
5-7 树的遍历   (25分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数NNN≤30\le 3030),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

  1. 7
  2. 2 3 1 5 7 6 4
  3. 1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

  1. #include<iostream>
  2. #include<queue>
  3. #include<stdlib.h>
  4. using namespace std;
  5. int btree[100]={0};
  6. int ctree[100]={0};
  7. #define SizeMax 105
  8. struct Node{
  9. Node *l;
  10. Node *r;
  11. int data;
  12. };
  13. int num=0;
  14. int n;
  15. Node * createTree(int btree[],int ctree[],int n)
  16. {
  17. if(n<=0)return NULL;
  18. //cout<<"12345"<<endl;
  19. Node *T;
  20. int ori=btree[n-1];//找到跟节点
  21. int k;
  22. T=(Node*)malloc(sizeof(Node));
  23. T->data=ori;
  24. for(int i=0;i<n;i++)//中序遍历左右分离
  25. {
  26. if(ctree[i]==ori)
  27. {
  28. k=i;break;
  29. }
  30. }
  31. T->l= createTree(btree,ctree,k);
  32. T->r=createTree(btree+k,ctree+k+1,n-k-1);
  33. return T;
  34. }
  35. void Print(Node *r)
  36. {
  37. Node *p;
  38. Node *pr[SizeMax];
  39. int rear=-1,front=-1;
  40. rear++;
  41. pr[rear]=r;
  42. while(rear!=front)
  43. {
  44. front=(front+1);
  45. p=pr[front];
  46. cout<<p->data;
  47. num++;
  48. if(num<n)
  49. cout<<" ";
  50. if(p->l!=NULL)
  51. {
  52. rear=(rear+1);
  53. pr[rear]=p->l;
  54. }
  55. if(p->r!=NULL)
  56. {
  57. rear=(rear+1);
  58. pr[rear]=p->r;
  59. }
  60. }
  61. }
  62. int main(){
  63. cin>>n;
  64. for(int i=0;i<n;i++)
  65. cin>>btree[i];
  66. for(int i=0;i<n;i++)
  67. cin>>ctree[i];
  68. Node *T=createTree(btree,ctree,n);
  69. Print(T);
  70. return 0;
  71. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/681801
推荐阅读
相关标签
  

闽ICP备14008679号