二叉树重建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); 
    } 
}; 

 

posted @ 2013-05-15 23:34  代码改变未来  阅读(177)  评论(0编辑  收藏  举报