构建二叉树(前序+中序,中序+后序)

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

题目链接

递归三部曲

1.返回值和参数:输出前序和中序的 vector< int > 和起止索引 int,输出树的根节点
2.单层递归逻辑:前序和中序只有一个元素,返回,否则在中序中找到前序的首位元素,在将中序按次元素划分为两个部分,当前节点的左子树根据划分的左边部分得到,右子树根据右边部分得到
3.终止条件:当前数组为1返回当前节点,为0返回 空

class Solution {
    unordered_map<int, int> inMap;
    TreeNode* buildTree(vector<int>& preorder, int preBegin, int preEnd, vector<int>& inorder, int inBegin, int inEnd)
    {
        if(preBegin >= preEnd)   return nullptr;
        TreeNode* root = new TreeNode(preorder[preBegin]);
        if(preEnd - preBegin == 1) return root;
        int index = inMap[root->val];
        int leftSize = index - inBegin;
        root->left = buildTree(preorder, preBegin + 1, preBegin + leftSize + 1, inorder, inBegin, index);
        root->right = buildTree(preorder, leftSize + preBegin + 1, preEnd, inorder, index + 1, inEnd);
        return root;
    }
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int size = preorder.size();
        for(int i = 0; i < size; ++i)
            inMap[inorder[i]] = i;
        return buildTree(preorder, 0, size, inorder, 0, size);
    }
};

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

1.返回值和参数:输出后序和中序的 vector< int > 和起止索引 int,输出树的根节点
2.单层递归逻辑:前序和中序只有一个元素,返回,否则在中序中找到后序的尾部元素,在将中序按次元素划分为两个部分,当前节点的左子树根据划分的左边部分得到,右子树根据右边部分得到
3.终止条件:当前数组为1返回当前节点,为0返回 空

class Solution {
    unordered_map<int, int> inMap;
    TreeNode* buildTree(vector<int>& inorder, int inBegin, int inEnd, vector<int>& postorder, int postBegin, int postEnd)
    {
        if(inBegin > inEnd)
            return nullptr;
        TreeNode* root = new TreeNode(postorder[postEnd]);
        if(inBegin == inEnd)
            return root;
        //int index = inBegin;
        //while(index <= inEnd && inorder[index] != root->val) ++index;
        int index = inMap[root->val];
        int leftSize = index - inBegin;
        root->left = buildTree(inorder, inBegin, index - 1, postorder, postBegin, leftSize + postBegin - 1);
        root->right = buildTree(inorder, index + 1, inEnd, postorder,leftSize + postBegin, postEnd - 1);        
        return root;
    }
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int inSzie = inorder.size() - 1;
        int postSize = postorder.size() - 1;
        
        for(int i = 0; i <= inSzie; ++i)
            inMap[inorder[i]] = i;
        return buildTree(inorder, 0, inSzie, postorder, 0, postSize);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值