重建二叉树(无重复值)

这篇博客详细介绍了如何通过二叉树的前序和中序遍历来重建原始的二叉树结构。首先,前序遍历的第一个元素作为根节点,然后在中序遍历中找到根节点的位置,以此确定左右子树的范围。通过递归函数`build`,分别构建左子树和右子树,直至所有节点都被处理。整个过程充分利用了两种遍历方式的特点,确保了二叉树的正确构造。
摘要由CSDN通过智能技术生成

给出需要重建的二叉树的前序遍历和中序遍历,需要还原该二叉树。
思路:
前序遍历:【根】【左子树】【右子树】
中序遍历:【左子树】【根】【右子树】
故前序遍历的第一个元素就是根的数值,获取根植后在中序遍历中就可以找到左、右子树个数等信息了。
对于二叉树生成需要如下信息(二叉树根的下标是基于前序遍历生成的,中序遍历用于已知根后,判断该二叉树所包含的左右子树所用范围):
函数TreeNode build(int root, int left, int right)参数意义:
root:根节点在前序遍历中的下标
left:该树在中序遍历中的左边界
right:该树在中序遍历中的右边界

public TreeNode buildTree(int[] preorder, int[] inorder) {
        preoders = preorder;
        for (int i = 0; i < inorder.length; i++) {
            inordered.put(inorder[i], i);
        }
        return build(0, 0, preorder.length - 1);
    }

    TreeNode build(int root, int left, int right) {
        if (left > right) {
            return null;
        }
        int rootNum = preoders[root];
        TreeNode node = new TreeNode(rootNum);
        int rootPos = inordered.get(rootNum);
        node.left = build(root + 1, left, rootPos - 1);
        node.right = build(rootPos - left + root + 1, rootPos + 1, right);
        return node;
    }

第一次生成:根为前序0下标,左子树范围从0到长度-1

左子树生成:
根:在前序遍历将root下标+1
左边界:和传进来的左边界相同
右边界:在中序遍历中根下标即rootPos-1

右子树生成:
根:在前序遍历中将根root+左子树节点数量+1
(左子树节点数量=在中序遍历中根下标rootPos-左边界left)
左边界:中序遍历中根下标即rootPos+1
右边界:和传进来的右边界相同
(上述根节点依据前序遍历图推导理解,边界根据中序遍历图推导理解)

用递归函数持续生成即可重建二叉树。

注:
每一次的生成实际只需要二叉树根节点的值,传进的左、右边界主要是用于判断是否还有子树需要生成。
根节点值获取:实际包括第一次,每当查找一个二叉树的根值时,该树的前序遍历的第一个值就是根值。这也就是为什么函数参数中根的下标是依据前序遍历来推导的。
左右边界利用中序遍历只需要对中序遍历中的根节点下标进行±1操作就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值