前序/中序遍历/树的重建/LeetCode 105

在这里插入图片描述
题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

  • 首先,要明白preorder和inorder的关系,preorder中的第一个往往是那颗(子)树的根节点,在inorder中就可以把序列分为左右两半(左树、右树)。
  • 这里选择前序遍历构造树:也就是先构造根节点,再构造左子树和右子树。
  • 如何构造:首先我们知道preorder的第一个就是根节点,而不知道下一个结点究竟是左子树还是右子树,这个时候我们就要根据inorder来划分,preorder中的那个根节点root所在inorder中的位置cur,cur左边([left,cur-1])就是其左子树,cur右边([cur+1,right])就是其右子树。
class Solution {
public:
    int pos = -1;
    vector<int> preorder,inorder;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        this->preorder = preorder;
        this->inorder = inorder;
        int n = preorder.size() - 1;
        return rebuild(0,n);
    }

    TreeNode* rebuild(int left,int right){
        if(left > right) return NULL;
        //前序遍历式构造
        TreeNode* root = new TreeNode(preorder[++pos]);
        //root->left->right
        int mid = 0;
        while(inorder[mid] != root->val) ++mid;

        root->left = rebuild(left,mid-1);
        root->right = rebuild(mid+1,right);
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值