美文网首页小浊微清的博客
根据前序和后序遍历构造二叉树

根据前序和后序遍历构造二叉树

作者: 小浊微清 | 来源:发表于2018-08-19 18:20 被阅读117次

在leetcode上做题刚好做到一题:根据前序和后序遍历构造二叉树。在我们一般构建二叉树时,一般是根据中序和前序或者后序构建二叉树。根据前序和后序构建的二叉树不一定是唯一的。

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

不多说,上代码:

public TreeNode constructFromPrePost(int[] pre, int[] post) {
    if (pre.length <= 0) {
        return null;
    }
    return constructFromPrePostHelper(pre, post, 0, 0, post.length - 1);
}

private TreeNode constructFromPrePostHelper(int[] pre, int[] post, int flag, int postStart, int postEnd) {
    if (flag >= pre.length || postStart > postEnd) {
        return null;
    } else if (flag < pre.length && postStart == postEnd) {//判断没有子树的节点
        return new TreeNode(pre[flag]);
    }
    int mid = postStart;
    //判断左右子树的分隔点
    if (flag + 1 < pre.length) {
        for (; mid < postEnd; mid++) {
            if (post[mid] == pre[flag + 1]) {
                break;
            }
        }
    }
    TreeNode node = new TreeNode(pre[flag]);
    node.left = constructFromPrePostHelper(pre, post, flag + 1, postStart, mid);
    node.right = constructFromPrePostHelper(pre, post, flag + mid - postStart + 2, mid + 1, postEnd - 1);
    return node;
}

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

测试用例:
输入:pre [1,2,4,5,3,6,7], post [4,5,2,6,7,3,1]
输出:[1, 2, 3, 4, 5, 6, 7]

原理:
在通过递归的方式,每次找到分隔点,构建左右子树的方式,在其中主要需要判断最终一个没有子树的节点判断。

相关文章

网友评论

  • 铎铎孤鸣:🙃🙃真的好厉害(ง •̀_•́)ง。代码 那个英语 都认不全 认不到 好厉害
    铎铎孤鸣:@小浊微清 😂😂不懂(=_=)yeah。我C++国二都是😓靠练题库才过的😂🙃🙃
    小浊微清:@铎铎孤鸣 说笑了,英文不一定是单词😂😂

本文标题:根据前序和后序遍历构造二叉树

本文链接:https://www.haomeiwen.com/subject/lzaciftx.html