根据遍历序列构造二叉树

1.从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

3
/ \
9 20
/ \
15 7

代码:

/**
 * 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* build(vector<int>& inorder, int inStart, int inEnd,
                    vector<int>& postorder, int postStart, int postEnd){
        if(inStart>inEnd || postStart>postEnd)
            return NULL;

        TreeNode* root=new TreeNode(postorder[postEnd]);
        for(int i=inStart;i<=inEnd;i++){
            if(inorder[i]==postorder[postEnd]){
                root->left=build(inorder,inStart,i-1,postorder,postStart,postStart+i-inStart-1);
                root->right=build(inorder,i+1,inEnd,postorder,postStart+i-inStart,postEnd-1);
            }
        }

        return root;
    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        //先中序中找到根后,可以根据根在中序中的位置划分左右子树的长度,根据中序中划分的左右子树的长度,在后序中划分左右子树,后序序列中:左、右、根。

        if(inorder.empty() || postorder.empty() || inorder.size()!=postorder.size())
            return NULL;

        return build(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
    }
};

2.从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

3
/ \
9 20
/ \
15 7

代码:

/**
 * 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* build(vector<int>& inorder, int inStart, int inEnd,
                    vector<int>& preorder, int preStart, int preEnd){
        if(inStart>inEnd || preStart>preEnd)
            return NULL;

        TreeNode* root=new TreeNode(preorder[preStart]);
        for(int i=inStart;i<=inEnd;i++){
            if(inorder[i]==preorder[preStart]){
                root->left=build(inorder,inStart,i-1,preorder,preStart+1,preStart+i-inStart);
                root->right=build(inorder,i+1,inEnd,preorder,preStart+1+i-inStart,preEnd);
            }
        }

        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(inorder.empty() || preorder.empty() || inorder.size()!=preorder.size())
            return NULL;

        return build(inorder,0,inorder.size()-1,preorder,0,preorder.size()-1);
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/107767668