当前位置:   article > 正文

根据中序遍历和后序遍历重建二叉树_数据结构用中序和后续同时构造二叉数

数据结构用中序和后续同时构造二叉数

二叉树的重建

二叉树的重建方法:
一、根据前序加中序遍历重建二叉树
构造该二叉树的过程如下:
1. 根据前序序列的第一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在前序序列中确定左右子树的前序序列;
4. 由左子树的前序序列和中序序列建立左子树;
5. 由右子树的前序序列和中序序列建立右子树。
二、根据中序加后序遍历重建二叉树
构造该二叉树的过程如下:
1. 根据后序序列的最后一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在后序序列中确定左右子树的后序序列;
4. 由左子树的后序序列和中序序列建立左子树;
5. 由右子树的后序序列和中序序列建立右子树。
三、前序加后序
前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树。
下面是一棵二叉树:
前序遍历:1 2 4 3 5 7 6 
中序遍历:2 4 1 5 7 3 6
后序遍历:4 2 7 5 6 3 1
前序+中序重建二叉树
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct node{
  4. int data;
  5. struct node *lchild,*rchild;
  6. }bitree;
  7. void rebuild(int *prelist,int *inlist,int n,bitree **t)
  8. {
  9. if(!prelist || !inlist || n<=0 ) //空树
  10. return;
  11. int i;
  12. //找到根结点在中序遍历中的位置
  13. for(i = 0; i < n; i++)
  14. {
  15. if(inlist[i] == prelist[0])
  16. break;
  17. }
  18. if(i>=n)
  19. return;
  20. //初始化根结点
  21. *t = (bitree*)malloc(sizeof(bitree));
  22. if(!t)
  23. return;
  24. (*t)->lchild = (*t)->rchild = NULL;
  25. (*t)->data = prelist[0];
  26. //重建左子树
  27. rebuild(prelist+1,inlist,i,&(*t)->lchild);
  28. //重建右子树
  29. rebuild(prelist+i+1,inlist+i+1,n-i-1,&(*t)->rchild);
  30. }
  31. void postOrderTraverse(bitree *t)
  32. { // 后序遍历
  33. if(t)
  34. {
  35. postOrderTraverse(t->lchild);
  36. postOrderTraverse(t->rchild);
  37. printf("%d ",t->data);
  38. }
  39. }
  40. int main()
  41. {
  42. int pre[] = {1,2,4,3,5,7,6};
  43. int in[] = {2,4,1,5,7,3,6};
  44. bitree *t = NULL;
  45. rebuild(pre,in,7,&t);
  46. postOrderTraverse(t);
  47. return 0;
  48. }

 
中序+后序重建二叉树:
  1. void rebuild(int *inlist,int *postlist,int n,bitree **t)
  2. {
  3. if(!inlist || !postlist || n<=0 ) //空树
  4. return;
  5. int i;
  6. //找到根结点在中序遍历中的位置
  7. for(i = 0; i < n; i++)
  8. {
  9. if(inlist[i] == postlist[n-1])
  10. break;
  11. }
  12. if(i>=n)
  13. return;
  14. //初始化根结点
  15. *t = (bitree*)malloc(sizeof(bitree));
  16. if(!t)
  17. return;
  18. (*t)->lchild = (*t)->rchild = NULL;
  19. (*t)->data = postlist[n-1];
  20. //重建左子树
  21. rebuild(inlist,postlist,i,&(*t)->lchild);
  22. //重建右子树
  23. rebuild(inlist+i+1,postlist+i,n-i-1,&(*t)->rchild); //post+i
  24. }

====2023.1.28更新====

剑指offer07. 重建二叉树

  1. #include<iostream>
  2. #include<vector>
  3. #include<stack>
  4. using namespace std;
  5. struct TreeNode {
  6. int val;
  7. TreeNode *left;
  8. TreeNode *right;
  9. TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  10. };
  11. class Solution {
  12. public:
  13. TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
  14. if (preorder.size() == 0 || inorder.size() == 0) {
  15. return NULL;
  16. }
  17. TreeNode *root = new TreeNode(preorder[0]);
  18. int i = 0;
  19. for ( ; i < inorder.size(); i++) {
  20. if (preorder[0] == inorder[i]) {
  21. break;
  22. }
  23. }
  24. vector<int> leftPre(preorder.begin()+1,preorder.begin()+i+1);
  25. vector<int> rightPre(preorder.begin()+i+1,preorder.end());
  26. vector<int> leftIn(inorder.begin(),inorder.begin()+i);
  27. vector<int> rightIn(inorder.begin()+i+1,inorder.end());
  28. root->left = buildTree(leftPre,leftIn);
  29. root->right = buildTree(rightPre,rightIn);
  30. return root;
  31. }
  32. };
  33. void preOrderTraverse(TreeNode *root) {
  34. if (root == NULL) {
  35. return;
  36. }
  37. stack<TreeNode*> stk;
  38. stk.push(root);
  39. vector<int> ans;
  40. while (!stk.empty()) {
  41. root = stk.top();
  42. stk.pop();
  43. if (root) {
  44. if (root->right) {
  45. stk.push(root->right);
  46. }
  47. if (root->left) {
  48. stk.push(root->left);
  49. }
  50. stk.push(root);
  51. stk.push(NULL);
  52. } else {
  53. root = stk.top();
  54. ans.push_back(root->val);
  55. if (!stk.empty()) {
  56. stk.pop();
  57. }
  58. }
  59. }
  60. for (int &x : ans) {
  61. cout << x << " ";
  62. }
  63. cout << endl;
  64. }
  65. int main() {
  66. vector<int> nums = {3,9,20,-1,-1,15,7};
  67. int n = nums.size();
  68. // 1.构建二叉树
  69. vector<TreeNode*> tree(n,NULL);
  70. tree[0] = new TreeNode(nums[0]);
  71. for (int i = 1; i < n; i++) {
  72. if (nums[i] == -1) {
  73. continue;
  74. }
  75. int parent = (i%2) ? i/2 : i/2-1;
  76. tree[i] = new TreeNode(nums[i]);
  77. if (i % 2) {
  78. tree[parent]->left = tree[i];
  79. } else {
  80. tree[parent]->right = tree[i];
  81. }
  82. }
  83. // 2.二叉树的先序遍历
  84. preOrderTraverse(tree[0]);
  85. cout << "====rebuild====" << endl;
  86. // 3.重建二叉树
  87. vector<int> preorder = {3,9,20,15,7};
  88. vector<int> inorder = {9,3,15,20,7};
  89. Solution s;
  90. TreeNode *root = s.buildTree(preorder, inorder);
  91. preOrderTraverse(root);
  92. return 0;
  93. }

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

闽ICP备14008679号