当前位置: 首页 > article >正文

Leetcode105从前序与中序遍历序列构造二叉树

Leetcode105从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorderinorder ,其中 preorder 是二叉树的先序遍历inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

img

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

image-20241126131228855

public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
        if (preorder_left > preorder_right) {
            return null;
        }

        // 前序遍历中的第一个节点就是根节点
        int preorder_root = preorder_left;
        // 在中序遍历中定位根节点
        int inorder_root = indexMap.get(preorder[preorder_root]);

        // 先把根节点建立出来
        TreeNode root = new TreeNode(preorder[preorder_root]);
        // 得到左子树中的节点数目
        int size_left_subtree = inorder_root - inorder_left;
        // 递归地构造左子树,并连接到根节点
        // 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
        root.left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
        // 递归地构造右子树,并连接到根节点
        // 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
        root.right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
        return root;
    }

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;
        // 构造哈希映射,帮助我们快速定位根节点
        indexMap = new HashMap<Integer, Integer>();
        for (int i = 0; i < n; i++) {
            indexMap.put(inorder[i], i);
        }
        return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
    }

dTree(preorder, inorder, 0, n - 1, 0, n - 1);
}



http://www.kler.cn/a/411208.html

相关文章:

  • 如何使用GCC手动编译stm32程序
  • visionpro实践项目(一)
  • Qt SQL模块概述
  • Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换
  • 【分治】--- 快速选择算法
  • FFmpegFrameRecorder 切分视频文件时结束条件设置不当导致切分后的文件过短问题
  • tableau-制作30个图表
  • 和数集团业务说明会(南京站)顺利举办
  • Flink Sink的使用
  • 【贪心算法第四弹——376.摆动序列】
  • VisionPro 机器视觉案例 之 凹点检测
  • JAVA面向对象核心部分
  • C++设计模式之组合模式实践原则
  • 在 Mac(ARM 架构)上安装 JDK 8 环境
  • React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法
  • 2024小迪安全基础入门第七课
  • 【实用技能】使用 DHTMLX Diagram让复杂流程可视化
  • C++11特性(详解)
  • SQL on Hadoop
  • 文心一言与千帆大模型平台的区别:探索百度AI生态的双子星
  • 网络安全:关于SecOC及测试开发实践简介
  • 华硕笔记本电脑用U盘重装windows系统
  • 自动化立体仓库堆垛机货叉故障处理
  • Faster R-CNN (目标检测)
  • Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具
  • [自动化测试:实践01]:2:(4-1 )元素定位(selenium)在实际场景中的应用2