Construct Binary Tree from Preorder and Inorder Traversal(根据先序遍历和中序遍历构建二叉树)
【难度:Medium】
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
给定一棵二叉树的先序遍历和中序遍历结果,重构该二叉树。
假定二叉树中无重复值出现。
解题思路
根据题意,我们先来看一棵二叉树的先序遍历和中序遍历的结果:
先序遍历:1,2,4,6,7,5,3,8,9
中序遍历:6,4,7,2,5,1,8,3,9
与LeetCode 106题类似,
由先序遍历的定义,我们知道第一个值必定是二叉树的根节点root。由而中序遍历的定义,我们又可以发现根节点是左右子树的分界点。结合两者和在106题的基础上,对106的代码稍作修改,由先序遍历来确定每一个根节点,然后在中序遍历中找到该节点的下标i,那么[start, i-1]就是该i节点的左子树,[i+1, end]就是该i节点的右子树,直到叶子节点的出现。
c++代码如下:
/**
* 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) {
if (preorder.empty())
return NULL;
int root_index = 0;
return createBST(preorder,inorder,root_index,preorder.size()-1,root_index);
}
TreeNode* createBST(vector<int>& preorder, vector<int>& inorder, int start, int end, int& index) {
int v = preorder[index];
int i = start;
for (i; i <= end; i++)
if (v == inorder[i])
break;
TreeNode* root = new TreeNode(v);
if (i-1 >= start)
root->left = createBST(preorder,inorder,start,i-1,++index);
if (end >= i+1)
root->right = createBST(preorder,inorder,i+1,end,++index);
return root;
}
};