每天一道LeetCode-----根据中序遍历和后序遍历重构二叉树
2017-12-30 14:40
288 查看
Construct Binary Tree from Inorder and Postorder Traversal
原题链接Construct Binary Tree from Inorder and Postorder Traversal根据中序遍历序列和后序遍历序列重构一棵二叉树
有了每天一道LeetCode—–根据先序遍历和中序遍历还原二叉树的基础,对于本题首先想到的就是也利用拆分成左右子树的方法
但是由于中序和后序都不是从根节点开始的,两个序列的第一个元素都不是根节点的值。不过呢,根据后序遍历的性质,根节点总是最后被遍历到,所以后序遍历的最后一个值一定是整棵二叉树的值
所以,如果尝试将后序遍历逆序,是不是可以看成是”盗版”的先序遍历呢,只是这次是先遍历右子树后遍历左子树
后序遍历都逆序了自然也要将中序遍历逆序,中序遍历逆序可以看成是”盗版”的中序遍历,即同样是先遍历右子树再遍历左子树
那么,本题就和根据先序遍历和中序遍历结果还原二叉树一样了,只是构造左右子树时恰好相反
代码如下
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { vector<int> re_inOrder(inorder.rbegin(), inorder.rend()); vector<int> re_postOrder(postorder.rbegin(), postorder.rend()); return buildTree(0, 0, re_inOrder.size() - 1, re_inOrder, re_postOrder); } private: TreeNode* buildTree(int re_postStart, int re_inStart, int re_inEnd, vector<int>& re_inOrder, vector<int>& re_postOrder) { if(re_postStart >= re_postOrder || re_inStart > re_inEnd) return nullptr; TreeNode* root = new TreeNode(re_postOrder[re_postStart]); int re_inIndex = 0; for(int i = re_inStart; i <= re_inEnd; ++i) { if(re_inOrder[i] == re_postOrder[re_postStart]) { re_inIndex = i; break; } } root->right = buildTree(re_postStart + 1, re_inStart, re_inIndex - 1, re_inOrder, re_postOrder); root->left = buildTree(re_postStart + 1 + re_inIndex - re_inStart, re_inIndex + 1, re_inEnd, re_inOrder, re_postOrder); return root; } };
本题和通过先序遍历和中序遍历重构二叉树使用的方法相同,可以看到,对于二叉树,基本上都是利用递归,在以后遇到二叉树的题时也最好先思考递归求解的思路。而通常通过递归都是将二叉树拆分成左右两棵子树
相关文章推荐
- Leetcode - Tree - 106. Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历重构二叉树)
- [leetcode]_根据二叉树的先序遍历(后序遍历) + 中序遍历 重建二叉树
- LeetCode(Construct Binary Tree from Preorder and Inorder Traversal )根据二叉树的中序遍历和后序遍历重建二叉树
- 每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树
- [LeetCode]106 根据中序遍历和后序遍历构建二叉树
- 数据结构——根据后序遍历与中序遍历构建二叉树
- java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)
- LeetCode: 106_Construct Binary Tree from Inorder and Postorder Traversal | 根据中序和后序遍历构建二叉树 | Medium
- 根据中序遍历和后序遍历重建二叉树
- 根据二叉树的中序遍历和后序遍历创建 一棵二叉树,并且返回所创建的树的树高,具体方法请参见下面源码(经过调试,无任何bug存在)
- 根据前序遍历、中序遍历构建二叉树,并后序遍历输出。
- 每天一道LeetCode-----二叉树逐层遍历,每一层存在一个序列中,返回所有序列集合
- LeetCode之通过二叉树的中序遍历和后序遍历还原二叉树
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 根据中序遍历和先序遍历,后序遍历创建二叉树。
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 二叉树的创建、前序遍历、中序遍历、后序遍历
- java编写二叉树以及前序遍历、中序遍历和后序遍历
- 二叉树的前序遍历、中序遍历、后序遍历概念
- 已知二叉树前序,中序遍历,求后序遍历,java实现