当前位置:   article > 正文

从中序与后序遍历构造二叉树_后序遍历和中序遍历构造二叉树

后序遍历和中序遍历构造二叉树

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

提示:

1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值组成
postorder 中每一个值都在 inorder 中
inorder 保证是树的中序遍历
postorder 保证是树的后序遍历

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解析: 

这道题的题意是非常清晰的,是我们在学习二叉树的时候经常碰到的那种,给你前序、中序、后序遍历中的两者,让你构造原树或者另外一种遍历的结果。

题中给与我们的是树的中序遍历以及后序遍历

首先我们要理清这两者的大概思路是什么:

中序遍历的大概思路是:

1.遍历左子树

2.输出当前结点

3.遍历右子树

后序遍历的大概思路是:

1.遍历左子树

2.遍历右子树

3.输出当前结点

所以,中序遍历的结果分布是这样的:

左子树根节点右子树

而后序遍历的结果分布是这样的:

左子树右子树根节点

可以看出,通过后序遍历,我们非常容易找到树的根节点以及右子树的根节点

而在中序遍历中,以根节点为中心,又很清楚的将左右子树完美的分割开来

所以我们大致的代码思路可以为:

1.根据后序遍历确定根节点

2.创建根节点

3.在中序遍历中将左右子树分割开来

4.进入右子树重复上述操作

5.进入右子树重复上述操作

需要注意的一点是,由于后序遍历的结果分布,我们必须先遍历右子树,而后才可以遍历左子树

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right)
  10. * : val(x), left(left), right(right) {}
  11. * };
  12. */
  13. class Solution {
  14. int idx;
  15. unordered_map<int, int> idx_map;
  16. public:
  17. TreeNode* creating(int left, int right,
  18. vector<int>& inorder, vector<int>& postorder) {
  19. //判断是该子树是否为空
  20. if (left > right) {
  21. return nullptr;
  22. }
  23. //取出根节点的值
  24. int val = postorder[idx];
  25. TreeNode* root = new TreeNode(val);
  26. //确认分割位置
  27. int split = idx_map[val];
  28. //寻找后序遍历中的下一个元素,类的成员变量
  29. idx--;
  30. //在中序遍历中划出右子树部分,在它的基础上建立右子树
  31. root->right = creating(split + 1, right, inorder, postorder);
  32. //在中序遍历中划出左子树部分,在它的基础上建立左子树
  33. root->left = creating(left, split - 1, inorder, postorder);
  34. return root;
  35. }
  36. TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
  37. idx = inorder.size() - 1;
  38. int cnt = 0;
  39. //将中序遍历中元素与其下标对应存储。
  40. for (int& i : inorder) {
  41. idx_map[i] = cnt++;
  42. }
  43. return creating(0, idx, inorder, postorder);
  44. }
  45. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/360630
推荐阅读
相关标签
  

闽ICP备14008679号