输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
前序遍历:[[根节点] [左子树] [右子树]]
中序遍历:[[左子树] [根节点] [右子树]]
采用递归/分治
时间复杂度O(n),空间复杂度O(N)
class Solution {
public:
//中左右、左中右
TreeNode* build(vector<int>& preorder, vector<int>& inorder,int preleft,int preright,int inleft,int inright){
TreeNode *root = new(TreeNode)(preorder[preleft]);
int pos = inleft;
while(pos<=inright&&inorder[pos]!=preorder[preleft]){
pos++;
}
int leftsize = pos-inleft,rightsize = inright-pos;
if(leftsize) root->left = build(preorder,inorder,preleft+1,preleft+leftsize,inleft,pos-1);
if(rightsize) root->right = build(preorder,inorder,preleft+leftsize+1,preright,pos+1,inright);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//pos1指向前序的根节点,pos2指向中序的根节点,pos3指向分界线。
int size = preorder.size(),preleft=0,preright=size-1,inleft=0,inright=size-1;
if(size==0) return NULL;
return build(preorder,inorder,preleft,preright,inleft,inright);
}
};