【前序+中序】重建二叉树


求解代码

java 复制代码
public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        int pre_len = preOrder.length;
        int vin_len = vinOrder.length;

        if (pre_len == 0 || vin_len == 0) {
            return null;
        }

        TreeNode root = new TreeNode(preOrder[0]);
        for (int i = 0; i < vinOrder.length; i++) {
            if (preOrder[0] == vinOrder[i]) {
                // 左子树:前序从[1, i+1)  中序从[0, i)
                root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, i + 1),
                                                  Arrays.copyOfRange(vinOrder, 0, i));
                // 右子树:前序从[i+1, pre_len)  中序从[i+1, vin_len)
                root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, i + 1,
                                                   preOrder.length), Arrays.copyOfRange(vinOrder, i + 1, vinOrder.length));
                break;
            }

        }
        return root;
    }

小贴士

bash 复制代码
Arrays.copyOfRange(原数组, from, to) → 复制数组的[from, to)区间,返回新数组;

中序遍历分割数组比较好理解:

中序遍历过程中左子树是从[0,i),右子树是从[i+1,vin_len)

前序遍历分割数组可能会有点绕,这里解释一下:

中序遍历 到位置i时,可以得知左子树所在的区间是[0,i-1],长度就是i

那么回到前序遍历中来,因为同一棵树它的左子树的长度在前序遍历和中序遍历的过程中是相同的,也就是长度是i,那么又因为前序遍历的0位置是根节点,则前序遍历的左子树所在的区间就是[1,i]

由于Arrays.copyOfRange方法是左闭右开区间,所以前序遍历过程中,左子树是从[1,i+1),右子树就是从[i+1,pre_len)

相关推荐
岱宗夫up40 分钟前
Python 数据分析入门
开发语言·python·数据分析
wangjialelele41 分钟前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
码界筑梦坊41 分钟前
325-基于Python的校园卡消费行为数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
历程里程碑43 分钟前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
多恩Stone1 小时前
【RoPE】Flux 中的 Image Tokenization
开发语言·人工智能·python
李日灐1 小时前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
晔子yy1 小时前
如何设计让你的程序同时处理10w条数据
java
Risehuxyc1 小时前
备份三个PHP程序
android·开发语言·php
Yvonne爱编码1 小时前
链表高频 6 题精讲 | 从入门到熟练掌握链表操作
java·数据结构·链表
lly2024061 小时前
PHP Error: 常见错误及其解决方法
开发语言