105. Construct Binary Tree from Preorder and Inorder Traversal (通过树的前序和中序遍历重建二叉树)
1. 题目翻译
给出一个树的前序和中序遍历序列,根据这两个序列,重建一个二叉树。假设不存在值相同的结点。
2. 解题方法
根据先序和中序的概念可知,在前序遍历序列中,第一个值为根节点,在相应的中序遍历序列中,该点前的所有值为该节点的左子树上的点。
例如:
前序遍历序列:[1,2,4,7,3,5,6,8]
中序便利序列:[4,7,2,1,5,3,8,6]
可知,结点1必为根节点,结点4,7,2必为结点1左子树上的结点,5,3,8,6必为右子树上的结点。所以将原序列分割为两半,即
前序遍历:[2,4,7],[3,5,6,8]
中序遍历:[4,7,2],[5,3,6,8]
然后通过递归可以完成这道题。
3. 代码
//Runtime: 23ms
class Solution {
private:
TreeNode* build(vector<int>& preorder,int pre_s,int pre_e, vector<int>& inorder,int in_s,int in_e){
if(pre_s>pre_e||in_s>in_e)
return NULL;
TreeNode* root = new TreeNode(preorder[pre_s]);
int count = 0;
for(int i = in_s;i<in_e;i++){
if(inorder[i]==root->val)
break;
count++;
}
root->left = build(preorder,pre_s+1,pre_s+count,inorder,in_s,in_s+count-1);
root->right = build(preorder,pre_s+count+1,pre_e,inorder,in_s+count+1,in_e);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size()==0||preorder.size()!=inorder.size())
return NULL;
TreeNode* root = new TreeNode(preorder[0]);
int count = 0;
for(int i = 0;i<inorder.size();i++){
if(inorder[i]==root->val)
break;
count++;
}
root->left = build(preorder,1,count,inorder,0,count-1);
root->right = build(preorder,count+1,preorder.size()-1,inorder,count+1,preorder.size()-1);
return root;
}
};