当前位置:   article > 正文

根据后序和中序遍历输出先序遍历 (25 分)第六章树和二叉树作业1—二叉树--计算机17级 7-1_c++已知一个二叉树的后序和中序序列,输出先序序列

c++已知一个二叉树的后序和中序序列,输出先序序列

7-1 根据后序和中序遍历输出先序遍历 (25 分)

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

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

输出样例:

Preorder: 4 1 3 2 6 5 7

 思路:现将其还原为二叉树,最后再先序遍历输出即可

后序和中序遍历确定一颗二叉树的思路:

a:根据后序遍历序列确定最后一个结点为根节点

b:根据根结点在中序遍历序列中分割出左右两个子序列

c:对左子树和右子树分别递归使用相同的方法继续分解

代码实现:

  1. #include <bits/stdc++.h>
  2. typedef int TElemType;//千万别写成char
  3. #define maxn 101
  4. using namespace std;
  5. typedef struct TNode* BinTree;
  6. struct TNode{
  7. TElemType data;
  8. BinTree left;
  9. BinTree right;
  10. };
  11. int n;
  12. int mid[maxn];
  13. int post[maxn];
  14. BinTree build(int *mid,int *post,int n)//第一个参数是中序序列的起始位置,第二个参数是后序序列的起始位置
  15. {
  16. BinTree tmp = (BinTree)malloc(sizeof(TNode));
  17. tmp->data = post[n-1];//第一个结点指向后序遍历的最后,也就是后序的树根
  18. int i;
  19. if(n == 0)
  20. return NULL;
  21. for(i = 0;i < n;i++)
  22. {
  23. if(mid[i] == post[n-1])//找中序的根
  24. break;//找到就跳出来
  25. }
  26. tmp->left = build(mid,post,i);//传入左子树的mid与post
  27. tmp->right = build(mid+i+1,post+i,n-i-1);//传入右子树的mid与post
  28. //tmp->data = post[n-1];//第一个结点指向后序遍历的最后,也就是后序的树根
  29. return tmp;
  30. }
  31. void PreorderTraversal( BinTree BT )
  32. {
  33. if(BT)
  34. {
  35. cout<<" "<<BT->data;
  36. if(BT->left)
  37. PreorderTraversal( BT->left );
  38. if(BT->right)
  39. PreorderTraversal( BT->right );
  40. }
  41. else
  42. return ;
  43. }
  44. int main()
  45. {
  46. cin>>n;
  47. for(int i = 0;i < n;i++)
  48. cin>>post[i];
  49. for(int i = 0;i < n;i++)
  50. cin>>mid[i];
  51. BinTree t = build(mid,post,n);
  52. cout<<"Preorder:";
  53. PreorderTraversal(t);
  54. }

 

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

闽ICP备14008679号