前序遍历(或后序遍历)和中序遍历还原二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014303647/article/details/88357985

前序遍历+中序遍历构建二叉树

1、前序遍历的第一个元素A,为根结点
2、在中序遍历找到A,则在中序遍历中A左边是左子树,右边是右子树
3、递归(左右子树同样如此)
具体实现

/*
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
*/
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return help(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
    }
    TreeNode* help(vector<int>& preorder,int begin1,int end1,vector<int>& inorder,int begin2,int end2)
    {
        if(begin1>end1)
            return NULL;
        else if(begin1==end1)
            return new TreeNode(preorder[begin1]);
            
        TreeNode* root=new TreeNode(preorder[begin1]);
        int i;
        for(i=begin2;i<end2;i++)
            if(inorder[i]==preorder[begin1])
                break;
        int leftlen=i-begin2;
        root->left=help(preorder,begin1+1,begin1+leftlen,inorder,begin2,begin2+leftlen-1);
        root->right=help(preorder,begin1+leftlen+1,end1,inorder,begin2+leftlen+1,end2);
        return root;
    }
};

后序遍历+中序遍历

1、后序遍历的最后一个元素A,为根结点
2、在中序遍历找到A,则在中序遍历中A左边是左子树,右边是右子树
3、递归(左右子树同样如此)
具体实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        return help(postorder,0,postorder.size()-1,inorder,0,inorder.size()-1);        
    }
    TreeNode* help(vector<int>& postorder,int begin1,int end1,vector<int>& inorder,int begin2,int end2)
    {
        if(begin1>end1)
            return NULL;
        else if(begin1==end1)
            return new TreeNode(postorder[end1]);
            
        TreeNode* root=new TreeNode(postorder[end1]);
        int i;
        for(i=begin2;i<end2;i++)
            if(inorder[i]==postorder[end1])
                break;
        int leftlen=i-begin2;
        int rightlen=postorder.size()-leftlen;
         root->left=help(postorder,begin1,begin1+leftlen-1,inorder,begin2,begin2+leftlen-1);
        root->right=help(postorder,begin1+leftlen,end1-1,inorder,begin2+leftlen+1,end2);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/u014303647/article/details/88357985