LeetCode 热题 HOT 100:从前序与中序遍历序列构造二叉树、二叉树展开为链表、二叉树中的最大路径和

news2024/12/25 9:29:17

LeetCode 热题 HOT 100

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

题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,
请构造二叉树并返回其根节点。
示例 1:在这里插入图片描述
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

package ricky.com.Hot100;

import java.util.HashMap; 

/**
 * @Author xdg
 */
public class buildTree {
    /*105. 从前序与中序遍历序列构造二叉树
    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,
    请构造二叉树并返回其根节点。*/

    // 定义二叉树节点的结构
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    class Solution {
        // 声明一个 HashMap,用于存储中序遍历数组中每个元素的索引
        HashMap<Integer, Integer> map = new HashMap<>();

        // 构建二叉树的函数,参数为先序遍历数组和中序遍历数组
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            // 将中序遍历数组中每个元素的值和索引存储到 HashMap 中
            for (int i = 0; i < inorder.length; i++) {
                map.put(inorder[i], i);
            }

            // 调用递归函数构建二叉树,返回根节点
            return f(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
        }

        // 递归函数,参数为先序遍历数组、中序遍历数组、以及它们在当前递归层次下的边界
        private TreeNode f(int[] preorder, int l1, int r1, int[] inorder, int l2, int r2) {
            // 如果左边界大于右边界,说明当前子树为空,返回 null
            if (l1 > r1) {
                return null;
            }

            // 构建当前子树的根节点
            TreeNode root = new TreeNode(preorder[l1]);
            // 在中序遍历数组中找到根节点的位置
            int i = map.get(preorder[l1]);
            // 递归构建左子树,左子树的元素范围为 preorder[l1+1, l1+i-l2] 和 inorder[l2, i-1]
            root.left = f(preorder, l1 + 1, l1 + i - l2, inorder, l2, i - 1);
            // 递归构建右子树,右子树的元素范围为 preorder[l1+i-l2+1, r1] 和 inorder[i+1, r2]
            root.right = f(preorder, l1 + i - l2 + 1, r1, inorder, i + 1, r2);
            // 返回当前子树的根节点
            return root;
        }
    }
}

114. 二叉树展开为链表

题目:给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
**示例 1:在这里插入图片描述

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

思路分析: 首先对二叉树进行先序遍历,将遍历结果存储到 List 中。然后遍历 List 中的节点,构建链表。具体来说,将 List 的第一个节点作为新的根节点,并将其左指针置为 null。然后定义一个指针 cur,初始时指向新的根节点,遍历 List 中的剩余节点,将当前节点的右指针指向下一个节点,将左指针置为 null,然后将指针 cur 指向当前节点,重复上述过程,直到遍历完所有节点为止。最后返回即可。

class Solution {
    List<TreeNode> list = new ArrayList<>(); // 声明一个 List,用于存储先序遍历的结果

    // 将二叉树拉平为链表的函数,参数为二叉树的根节点
    public void flatten(TreeNode root) {
        if (root == null) { // 如果根节点为空,直接返回
            return;
        }

        preOrder(root); // 对二叉树进行先序遍历,将结果存储到 List 中
        TreeNode newRoot = list.get(0); // 获取二叉树拉平后的新根节点
        newRoot.left = null; // 将新根节点的左指针置为 null
        TreeNode cur = newRoot; // 定义一个指针,指向当前处理的节点
        for (int i = 1; i < list.size(); i++) { // 遍历 List 中的节点,构建链表
            cur.right = list.get(i); // 当前节点的右指针指向下一个节点
            cur.left = null; // 当前节点的左指针置为 null
            cur = cur.right; // 将指针指向下一个节点
        }

        return;

    }

    // 递归函数,对二叉树进行先序遍历,并将结果存储到 List 中
    private void preOrder(TreeNode root) {
        if (root == null) { // 如果当前节点为空,直接返回
            return;
        }

        list.add(root); // 将当前节点加入到 List 中
        preOrder(root.left); // 递归遍历左子树
        preOrder(root.right); // 递归遍历右子树
    }
}

124. 二叉树中的最大路径和

题目:路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径
序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。。
**示例 1:在这里插入图片描述

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

思路分析: 使用后序遍历的方式遍历二叉树,并计算以每个节点为路径起点的最大路径和。对于每个节点,先递归遍历其左右子树,并计算出左右子树的最大路径和。然后,以当前节点为路径起点,计算当前节点的最大路径和,即计算当前节点的值加上左子树的最大路径和和右子树的最大路径和的和,以及当前节点的值与左右子树的最大路径和相加的和中的最大值。最后,更新全局最大路径和为当前路径的最大值,即 Math.max(res, Math.max(temp, root.val + left + right))。最终,返回全局最大路径和 res。

class Solution {
    int res = Integer.MIN_VALUE; // 定义全局变量,用于保存最大路径和

    public int maxPathSum(TreeNode root) {
        if (root == null) { // 如果根节点为空,返回0
            return 0;
        }

        postOrder(root); // 对树进行后序遍历,计算最大路径和
        return res; // 返回最大路径和
    }

    // 后序遍历二叉树,并计算以当前节点为起点的最大路径和
    private int postOrder(TreeNode root) {
        if (root == null) { // 如果当前节点为空,返回0
            return 0;
        }

        // 分别对左子树和右子树进行后序遍历,并计算左子树和右子树的最大路径和
        int left = postOrder(root.left);
        int right = postOrder(root.right);

        // 计算以当前节点为起点的最大路径和,并更新全局最大路径和
        int temp = Math.max(root.val, root.val + Math.max(left, right)); // 计算以当前节点为起点的路径
        res = Math.max(res, Math.max(temp, root.val + left + right)); // 更新全局最大路径和

        // 返回以当前节点为起点的最大路径和
        return temp;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webassembly——同源策略问题的处理(浏览器不能加载本地资源的问题)

原因&#xff1a;在用chatGPT生成可视化地图前端文件后&#xff0c;打开不能正常显示 WebAssembly是一种新的二进制代码格式&#xff0c;它可以提供更高的性能和更好的安全性。WebAssembly遵循同源策略&#xff0c;这意味着只有与运行WebAssembly代码相同域名下的JavaScript代码…

Linux --- 常用命令

一、常用命令 1.1、常用命令演示 在这一部分中&#xff0c;我们主要介绍几个常用的命令&#xff0c;让大家快速感受以下Linux指令的操作方式。主要包含 以下几个指令&#xff1a; 1.2、Linux命令使用技巧 在我们使用Linux系统命令时&#xff0c;可以使用以下几个技巧&#x…

丹麦PR electronics信号隔离器3185A1 3185A2安全栅

应用 1:1 标准电流信号隔离&#xff0c;信号范围 0(4)...20 mA。标准 DIN 导轨安装。无论在技术或是成本上&#xff0c;都是电流信号电气隔离的选择。能有效抑制浪涌电流&#xff0c;保护控制系统远离信号噪声和瞬变的影响。消除接地环路和测量浮地信号。安装于安全区域或 Zon…

03、Cadence使用记录之超多引脚元器件的快速创建方法(OrCAD Capture CIS)

03、Cadence使用记录之超多引脚元器件的快速创建方法&#xff08;OrCAD Capture CIS&#xff09; 参考的教程是B站的视频&#xff1a;allegro软件入门视频教程全集100讲 前置教程&#xff1a; 01、Cadence使用记录之新建工程与基础操作&#xff08;原理图绘制&#xff1a;OrC…

个人建议:真的不要去小公司...

软件测试人员如果想要有更好的发展真的不要去小公司&#xff01; 为什么&#xff1f; 小公司的测试团队相对较小&#xff0c;往往只有一两个人&#xff0c;缺乏资源和技术支持&#xff0c;难以优化测试流程和提高测试效率。 小公司一般缺乏完善的软件开发流程和质量管理体系&a…

基于LSTM神经网络的通用股票预测源代码+模型+数据集

基于神经网络的通用股票预测模 下载地址&#xff1a;基于LSTM神经网络的通用股票预测源代码模型数据集 0 使用方法 How to use 使用getdata.py下载数据&#xff0c;或者使用自己的数据源&#xff0c;将数据放在stock_daily目录下 使用data_preprocess.py预处理数据&#xff…

基于RK3568的Linux驱动开发——GPIO知识点(一)

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主系列基于RK3568的Linux驱动开发—— GPIO知识点&#xff08;二&#xff09;_daisy.skye的博客-CSDN博客 gpio bank RK3568 有 5 组 GPIO bank&#xff1a;GPIO0~GPIO4&#xff0c;每组又以 A0-A7、B0-B7、 C0-C7、 D0…

CSS基础样式

1.高度和宽度 .c1{height:300px;width:500px; } 注意事项&#xff1a; 宽度&#xff0c;支持百分比 行内标签&#xff1a;默认无效 块级标签&#xff1a;默认有效&#xff08;右侧区域就算是空白&#xff0c;也不给占用&#xff09; 2.块级和行内标签 css样式&#xff1a;标签…

软件工程实验:用例图设计

目录 前言 实验目的 实验要求 实验步骤 结果展示 总结 前言 软件工程导论实验是一门旨在培养学生掌握软件开发过程中的基本方法和技能的课程。本实验的主题是用例图设计&#xff0c;用例图是一种描述系统功能需求的图形化工具&#xff0c;它可以帮助分析和设计系统的行为…

初识Tkinter弹窗

Tkinter弹窗 Tkinter是什么 Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面&#xff0c;是一个图像的窗口&#xff0c;tkinter是python 自带的&#xff0c;可以编辑的GUI界面&#xff…

【蓝桥杯省赛真题17】python删除字符串 青少年组蓝桥杯python编程省赛真题解析

目录 python删除字符串 一、题目要求 1、编程实现 2、输入输出 二、解题思路

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库)

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库) 一、项目场景 在日常的项目中&#xff0c;我们经常会遇到调用别人的数学库、线程库、图形库等操作。这些库通常就被称为SDK&#xff0c;SDK全称是Software Development Kit&#xff08;软件开发工具包&#xff09;&#xff0c;…

【C++ 五】结构体

结构体 文章目录 结构体前言1 结构体基本概念2 结构体定义和使用3 结构体数组4 结构体指针5 结构体嵌套结构体6 结构体做函数参数7 结构体中 const 使用场景8 结构体案例8.1 案例一8.2 案例二 总结 前言 本文包含结构体基本概念、结构体定义和使用、结构体数组、结构体指针、结…

gitlab CI CD基础概念

gitlab CI CD基础概念 本文目录 gitlab CI CD基础概念基础概念Pipelines&#xff1a;流水线JobsStage .gitlab-ci.yml使用模式1&#xff1a;官网gitlab 本地gitlab runner使用模式2&#xff1a;docker gitlab docker gitlab runner 基础概念 开发模式转变&#xff1a;瀑布模…

【MySQL】(5)聚合函数

文章目录 聚合函数COUNT 函数SUM 函数AVG 函数MAX 函数 MIN 函数 group by 子句简介示例&#xff1a;scott 数据库单列分组多列分组 having 子句总结 聚合函数 在 MySQL 中&#xff0c;聚合函数是用于计算多行数据的统计信息的函数&#xff0c;例如总和、平均值、最大值、最小…

图扑数字孪生工厂合集 | 智慧工厂可视化,推动行业数字化转型

前言 图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#…

LeetCode算法小抄--花式遍历二叉树

LeetCode算法小抄--花式遍历二叉树花式遍历二叉树翻转二叉树[226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)填充节点的右侧指针[116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)将…

OpenCV实例(一)人脸检测

OpenCV实例&#xff08;一&#xff09;人脸检测 1.人脸检测和识别概述2.使用OpenCV进行人脸检测2.1静态图像中的人脸检测2.2视频中的人脸检测 作者&#xff1a;Xiou 1.人脸检测和识别概述 计算机视觉使很多任务成为现实&#xff0c;其中两项任务就是人脸检测&#xff08;在图…

psql Centos7安装postgresql-12

之前在centos7上下的postgresql&#xff0c;它的数据库实例在 “var/lib/pgsql/” 下。这就导致了系统用户的"postgres"的家目录跟postgresql数据库目录不在同一目录下。因此&#xff0c;今天趁着有闲暇时间把数据库装到"postgres"目录下&#xff0c;顺便把…

罗丹明荧光染料标记叶酸,FA-PEG2000-RB,叶酸-聚乙二醇-罗丹明; Folic acid-PEG-RB

FA-PEG-RB,叶酸-聚乙二醇-罗丹明 中文名称&#xff1a;叶酸-聚乙二醇-罗丹明 英文名称&#xff1a;FA-PEG-RB, Folic acid-PEG-RB 性状&#xff1a;粉红色固体或液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DMSO、DMF等常规性有机溶剂 保存条件&#xff1a;-2…