LeetCode 889.根据前序和后续遍历构造二叉树

题目

返回与给定的前序和后序遍历匹配的任何二叉树。
prepost 遍历中的值是不同的正整数。

示例

输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]

提示:

  • 1 <= pre.length == post.length <= 30
  • pre[] 和 post[] 都是 1, 2, ..., pre.length的排列
  • 每个输入保证至少有一个答案。如果有多个答案,可以返回其中一个。

题目链接

题目分析

这道题要求我们根据前序遍历和后序遍历构造二叉树。已知前序遍历的顺序是ulr,后序遍历的顺序是lru,所以前序遍历的第一个元素是根节点,后序遍历的最后一个元素也是根节点。

刨除根节点后,剩余序列均由l+r的顺序组成,我们只需要知道l或r的元素个数,就可以采用分治法递归的构建树。

以示例为例,我们简单分析一下这个过程,通过前序序列,我们可以知道左子树的头结点是2,我们可以在后序遍历序列中找到2,2之前的就是左子树,2之后的就是右子树。这样我们就可以确定左右子树的数量,可以分块进行建树操作了。

TreeNode* creTree(vector pre, int prel, int prer, vector post, int postl, int postr){
    if (prel > prer || postl > postr) return NULL;

    TreeNode* root = new TreeNode(pre[prel]);
    if (prel == prer) return root;

    int idx = 0;
    while (pre[prel + 1] != post[idx]) idx++;

    root->left = creTree(pre, prel + 1, idx - postl + prel + 1, post, postl, idx);
    root->right = creTree(pre, idx - postl + prel + 2, prer, post, idx + 1, postr - 1);

    return root;
}

题目解答

class Solution {
public:
    TreeNode* creTree(vector pre, int prel, int prer, vector post, int postl, int postr){
        if (prel > prer || postl > postr) return NULL;

        TreeNode* root = new TreeNode(pre[prel]);
        if (prel == prer) return root;

        int idx = 0;
        while (pre[prel + 1] != post[idx]) idx++;

        root->left = creTree(pre, prel + 1, idx - postl + prel + 1, post, postl, idx);
        root->right = creTree(pre, idx - postl + prel + 2, prer, post, idx + 1, postr - 1);

        return root;
    }

    TreeNode* constructFromPrePost(vector& pre, vector& post) {
        return creTree(pre, 0, pre.size() - 1, post, 0, post.size() - 1);
    }
};

你可能感兴趣的:(LeetCode 889.根据前序和后续遍历构造二叉树)