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


求解代码

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)

相关推荐
极客先躯8 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
看昭奚恤哭9 分钟前
Flutter 布局核心思想
开发语言·javascript·flutter
朱容zr33313325 分钟前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
IsSh9nj6q1 小时前
Python全栈应用搭建神器magic-dash .新版本介绍
开发语言·python·dash
知彼解己1 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
朱容zr3331331 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣4901 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
Cachel wood1 小时前
hands-on-modern-rl:动手学强化学习策略梯度reinforce
开发语言·python
NWU_LK1 小时前
【WebFlux】第八篇 —— 自定义调度器
java
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型