递归构造
中序和后序构造
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
int lenIn=inorder.size();
int lenPost=postorder.size();
if(lenIn==0 || lenPost==0)
return NULL;
return buildTreeCore(inorder,0,lenIn-1,postorder,0,lenPost-1);
}
TreeNode* buildTreeCore(vector<int>& inorder,int startIn,int endIn,vector<int>& postorder,int startPost,int endPost){
if(startIn>endIn||startPost>endPost)
return NULL;
int i=startIn;
for(;i<=endIn;i++){
if(inorder[i]==postorder[endPost])
break;
}
TreeNode* root=new TreeNode(postorder[endPost]);
root->left=buildTreeCore(inorder,startIn,i-1,postorder,startPost,startPost+i-startIn-1);
root->right=buildTreeCore(inorder,i+1,endIn,postorder,startPost+i-startIn,endPost-1);
return root;
}
中序和前序构造二叉树
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int lenpre=preorder.size();
int lenin=inorder.size();
if(lenpre==0||lenin==0)
return NULL;
return buildTreeCore(preorder,0,lenpre-1,inorder,0,lenin-1);
}
TreeNode* buildTreeCore(vector<int>& preorder,int startPre,int endPre,vector<int>& inorder,int startIn,int endIn){
if(startPre>endPre || startIn> endIn)
return NULL;
int i=startIn;
for(;i<=endIn;i++){
if(inorder[i]==preorder[startPre])
break;
}
TreeNode* root=new TreeNode(preorder[startPre]);
root->left=buildTreeCore(preorder,startPre+1,startPre+i-startIn,inorder,startIn,i-1);
root->right=buildTreeCore(preorder,startPre+i-startIn+1,endPre,inorder,i+1,endIn);
return root;
}