二叉树构造——前序和中序数组

原题在这里

  给两个数组表示前序和中序遍历结果,按此构造二叉树并返回根节点。

analyse:

  前序定根,中序分左右,铁板版的我写错了数组名字,瞎搞半小时浪费时间

code:

class Solution
{
    vector<int> pre, mid;
    int x;
    int find(int l, int r)
    {
        while (l < r && pre[x] != mid[l])
            l++;
        return l;
    }
    TreeNode *mk(int l, int r) //当前pre根节点位置为x,那么在mid序列中,找x位置,左右即为子树
    {
        //构造当前子数区间为l,r
        if (x >= pre.size() || l > r)
            return nullptr;
        int y = find(l, r); //当前在mid[l,y-1]+[y+1,r]
        TreeNode *n = new TreeNode(pre[x++]);
        n->left = mk(l, y - 1);
        n->right = mk(y + 1, r);
        return n;
    }

public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder)
    {
        pre = preorder, mid = inorder;
        x = 0;
        //先序定根,中序分左右
        return mk(0, pre.size() - 1);
    }
};

 

【Over】

posted @ 2022-03-28 17:19  Renhr  阅读(39)  评论(0)    收藏  举报