每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树
2017-12-29 14:04
393 查看
Construct Binary Tree from Preorder and Inorder Traversal
原题链接Construct Binary Tree from Preorder and Inorder Traversal给定一个二叉树的先序遍历和中序遍历,要求重现这棵二叉树
另先序遍历的序列为preorder,中序遍历的序列为inorder,节点个数为n
根据先序遍历的特点,可知preorder[0]一定是整棵二叉树的根节点,那么,如果已确定根节点值在中序遍历序列inorder中的下标是i,就一定有
inorder[0 : i - 1]这些值属于根节点的左子树
inorder[i + 1, n - 1]这些值属于根节点的右子树
因为中序遍历是从最左边开始遍历,所以当遍历到根节点inorder[i]时,之前遍历到的节点一定都属于左子树
那么现在的目的就是如何确定左右子树的根节点,由先序遍历可知
preorder[0 + 1]一定是左子树的根节点
preorder[0 + 1 + (i - 0)]一定是右子树的根节点
因为先序遍历遍历到的节点顺序是从根节点到最左边,再到右边,那么既然已经直到左子树上有多少节点了(i - 0个),那么就可以确定右子树的根节点
直接递归即可
/** * 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>& preorder, vector<int>& inorder) { return buildTree(0, 0, inorder.size() - 1, preorder, inorder); } private: /* preStart : 当前根节点在preorder中的下标 * [inStart:inEnd] : 以preorder[preStart]为根节点的子树的节点值在inorder的范围 */ TreeNode* buildTree(int preStart, int inStart, int inEnd, vector<int>& preorder, vector<int>& inorder) { if(preStart >= preorder.size() || inStart > inEnd) return nullptr; /* 申请根节点 */ TreeNode* root = new TreeNode(preorder[preStart]); /* 寻找根节点在inorder的位置,拆分左右子树 */ int inIndex = 0; for(int i = inStart; i <= inEnd; ++i) { if(inorder[i] == preorder[preStart]) { inIndex = i; break; } } root->left = buildTree(preStart + 1, inStart, inIndex - 1, preorder, inorder); root->right = buildTree(preStart + 1 + inIndex - inStart, inIndex + 1, inEnd, preorder, inorder); return root; } };
本题主要需要弄清楚如何进行递归,当然拆分成左右子树是个很好的方法,不够不太容易想到。
先序遍历可以直到根节点,而中序遍历可以确定该根节点的左右子树的取值范围,从而不断拆分下去,最终求解
相关文章推荐
- 每天一道LeetCode-----根据中序遍历和后序遍历重构二叉树
- 二叉树根据先序遍历和中序遍历,得到后序遍历
- 每天一道LeetCode-----二叉树逐层遍历,每一层存在一个序列中,返回所有序列集合
- 根据先序遍历和中序遍历生成二叉树
- 通过先序遍历和中序遍历后的序列还原二叉树(实现方法)
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- 根据先序和中序遍历还原二叉树并求其高度
- LeetCode: 106_Construct Binary Tree from Inorder and Postorder Traversal | 根据中序和后序遍历构建二叉树 | Medium
- 根据层次遍历和中序遍历的结果还原一颗二叉树
- 二叉树:根据二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 根据先序遍历和中序遍历建立二叉树
- poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历
- LeetCode 根据前序和中序遍历构造二叉树的三种解法
- 根据二叉树的先序遍历和中序遍历重构二叉树
- 已知二叉树的先序遍历(preorder)和中序遍历(inorder) 或 中序和后序(postorder),还原该二叉树
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- 如何根据前序、中序、后序遍历还原二叉树
- 根据前序遍历和中序遍历还原二叉树
- 根据二叉树的先序和中序遍历还原二叉树
- 根据先序遍历和中序遍历得出二叉树。最终以后序遍历的形式输出。