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


求解代码

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)

相关推荐
leaves falling1 分钟前
深入浅出 C++ STL list:从入门到精通
开发语言·c++
饕餮争锋1 分钟前
Bash 简介
开发语言·bash
吃不胖爹10 分钟前
Sharding-JDBC只分表不分库
java
yaaakaaang16 分钟前
十三、责任链模式
java·责任链模式
爱吃烤鸡翅的酸菜鱼19 分钟前
【Java】封装位运算通用工具类——用一个整数字段替代几十个布尔列,极致节省存储空间
java·开发语言·设计模式·工具类·位运算·合成复用原则
xinhuanjieyi22 分钟前
php给30支NBA球队添加logo图标,做好对应关系
android·开发语言·php
菜菜小狗的学习笔记26 分钟前
八股(三)Java并发
java·开发语言
云烟成雨TD30 分钟前
Spring AI Alibaba 1.x 系列【10】ReactAgent 工具加载和执行流程
java·人工智能·spring
lee_curry31 分钟前
JUC第一章 java中基础概念和CompletableFuture
java·多线程·并发·juc
一晌小贪欢43 分钟前
PyQt5 开发一个 PDF 批量合并工具
开发语言·qt·pdf