二叉树重建leetcode
1.前序中序确定
class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder)
{
if(preorder.size()==0||inorder.size()==0||preorder.size()!=inorder.size())return NULL;
TreeNode *root=NULL;
build(root,preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
return root;
}
void build(TreeNode *&root,vector<int> &preorder, vector<int> &inorder,int p1,int p2,int i1,int i2)
{
root=new TreeNode(preorder[p1]);
int j;
for(j=i1;j<=i2;j++)
{
if(inorder[j]==preorder[p1])break;
}
if(j!=i1)
build(root->left,preorder,inorder,p1+1,p1+j-i1,i1,j-1);
if(j!=i2)
build(root->right,preorder,inorder,p1+(j-i1)+1,p2,j+1,i2);
}
};
2.中序和后序确定
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
if(postorder.size()==0||inorder.size()==0||inorder.size()!=postorder.size())return NULL;
TreeNode *root=NULL;
build(root,inorder,postorder,0,inorder.size()-1,0,postorder.size()-1);
return root;
}
void build(TreeNode *&root,vector<int> &inorder, vector<int> &postorder,int i1,int i2,int p1,int p2)
{
root=new TreeNode(postorder[p2]);
int j;
for(j=i1;j<=i2;j++)
{
if(inorder[j]==postorder[p2])break;
}
if(j!=i1)
build(root->left,inorder,postorder,i1,j-1,p1,p1+j-1-i1);
if(j!=i2)
build(root->right,inorder,postorder,j+1,i2,p1+j-i1,p2-1);
}
};
浙公网安备 33010602011771号