前序/中序遍历/树的重建/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;
    }
};
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读