LeetCode 热题 100 题解:二叉树部分(1 ~ 5)

题目一:二叉树的中序遍历(No. 948)

94. 二叉树的中序遍历 - 力扣(LeetCode)

题目难度:简单


在这里插入图片描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

示例 1:

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

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100]
  • 100 <= Node.val <= 100

题解

方法一:递归解法

所谓中序遍历就是按照这个顺序去遍历处理一个**节点,**即 左子树、节点、右子树这样的方式,所以对于一个节点的处理方式就是这样的:

  • 遍历它的左子树、记录节点的值、遍历它的右子树

对每个节点都要进行上述的操作,而递归解法就可以实现这样的效果,只需要将上面的逻辑想清楚,剩下的交给递归去做就可以了。

在这里插入图片描述

class Solution {
    List<Integer> res = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        reversal(root);
        return res;
    }
    public void reversal(TreeNode node) {
        if (node == null) return;
        reversal(node.left); // 遍历左子树
        res.add(node.val); // 记录节点的值
        reversal(node.right); // 遍历右子树
    }
}

方法二:迭代法

迭代法和递归是等价的,只是将迭代法隐式维护的栈显示的表现出来。

在这里插入图片描述

对于一个节点需要进行的操作就是:遍历左子树、输出本节点、遍历右子树;执行的逻辑就是,从根节点开始一直 将所有左节点压入栈,当到达底部,也就是节点为 null 的情况

此时栈中的数据为 [ 1 2 ], 然后将节点 2 从栈中弹出并存储结果,(此时对于 2 节点来说完成的操作就是:遍历左子树和输出本节点)

然后 去遍历节点的右节点,对于这个右节点,要执行的操作和上面相同,继续执行完成上面的逻辑;然后当右节点也遍历完之后,对于 1 节点,它的左子树就遍历完成了,将 1 节点弹出然后去遍历它的右节点,发现为空,结束遍历。

看下面的动图更加直观一些,为了更好的展示迭代的条件,这里多加了一个节点
在这里插入图片描述

class Solution {
    List<Integer> res = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    public List<Integer> inorderTraversal(TreeNode root) {
    // 上面弹出 1 的情况,栈为空但是节点不为空,还需要检测右节点的值
        while (root != null || !stack.isEmpty()) { 
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            res.add(root.val);
            root = root.right;
        }
        return res;
    }
}

题目二:二叉树的最大深度(No. 104)

104. 二叉树的最大深度 - 力扣(LeetCode)

题目难度:简单


给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:在这里插入图片描述

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

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • 100 <= Node.val <= 100

题解

对于一个路径来说,其最大的深度就是遍历到叶子节点的时候,所以本题的思路其实很容易想出,就是遍历所有的路径,当抵达叶子节点的时候记录一个值,在其中取一个最大的就是最终需要的结果。

本题的第一个思路就是,使用一个变量 depth 来记录当前节点的深度,一个变量 res 来存储目前的最大深度,当发现 node == null 的时候(说明可能抵达了叶子节点),与 res 做比较取一个最大值,当结束二叉树的遍历的时候,将结果返回。

class Solution {
    int length = 0;
    int res = 0;
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        reversal(root);
        return res;
    }
        public void reversal(TreeNode node) {
        if (node == null) {
            res = Math.max(res, length);
            return;
        };
        length++;
        reversal(node.left);
        reversal(node.right);
        length--;
    }
}

除了这种方法,其实可以在递归中去使用返回值,将一层递归中的返回值定义为:以这个节点为根节点的二叉树的最大深度,然后可以写出这样的代码:

class Solution {
    public int maxDepth(TreeNode root) {
        return reversal(root);
    }
    public int reversal(TreeNode node) {
        if (node == null) {
            return 0;
        };
        int leftDep = reversal(node.left);
        int rightDep = reversal(node.right);
        return Math.max(leftDep, rightDep) + 1; // 选取最大值作为本层的深度
    }
}

题目三:翻转二叉树(No. 226)

226. 翻转二叉树 - 力扣(LeetCode)

题目难度:简单


给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:
在这里插入图片描述

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:
在这里插入图片描述

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • 100 <= Node.val <= 100

题解

题目中要求的翻转二叉树,就是使每个节点的左子树和右子树交换,从叶子节点开始不断向上递归,最终就可以达到翻转整个二叉树的目的。

class Solution {
    public TreeNode invertTree(TreeNode root) {
        reverse(root);
        return root;
    }
    public void reverse(TreeNode node) {
        if (node == null) return;
        TreeNode left = node.left;
        TreeNode right = node.right;
        // 交换左右节点
        node.left = right;
        node.right = left;
        reverse(node.left);
        reverse(node.right);
    }
}

题目四:对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

题目难度:简单


给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

!https://pic.leetcode.cn/1698026966-JDYPDU-image.png

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

!https://pic.leetcode.cn/1698027008-nPFLbM-image.png

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • 100 <= Node.val <= 100

题解

判断一个二叉树是否是对称二叉树,也就是判断左子树和右子树是否是对称的,这就需要镜像的遍历根节点的左子树和右子树,并在遍历的过程中不断的去比较两个节点是否相同。

用 left 表示左子树中的节点,用 right 表示右子树中的节点,镜像的去遍历和比较

  • 比较 left 的左节点和 right 的右节点
  • 比较 left 的右节点和 right 的左节点

通过上面两个步骤就实现了对于左子树和右子树镜像遍历,本题中需要收集结果,所以采用后序遍历的方式,将两个子树的结果进行与运算,作为本节点的结果返回。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return reversal(root.left, root.right);
    }
    public boolean reversal(TreeNode left, TreeNode right) {
    // 判断
        if (left != null && right == null) return false;
        if (left == null && right != null) return false;
        if (left == null && right == null) return true;
        if (left.val != right.val) return false;
        // 镜像遍历左右子树
        boolean res1 = reversal(left.left, right.right);
        boolean res2 = reversal(left.right, right.left);
        // 后序收集结果
        return res1 && res2;
    }
}

题目五:二叉树的直径(No. 543)

543. 二叉树的直径 - 力扣(LeetCode)

题目难度:简单


给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

!https://assets.leetcode.com/uploads/2020/11/26/tmp-tree.jpg

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

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • 100 <= Node.val <= 100

题解

对于一个节点来说,经过这个节点的最大路径就是从这个节点到左子树最深节点的距离加上从这个叶子节点到右子树最深叶子节点的距离

本题的思路就是在递归的过程中去计算每个节点的最大路径,然后不断的去收集和比较,当递归遍历完所有的节点之后,得到的结果就是最终的结果。

一个节点到其左边最深节点的距离就是它左子节点到最深节点的距离
同理,右边的最大距离就是右子节点到最深节点的距离

res = Math.max(res, leftDep + rightDep);

将这两个值相加,得到的结果就是经过这个节点的最大深度,同时要将本节点到叶子节点的最大距离返回给上一个节点用作计算。

return Math.max(leftDep, rightDep) + 1;

写出代码

class Solution {
    int depth = 0; // 深度,从叶子节点开始统计
    int res = 0; // 最终的结果
    public int diameterOfBinaryTree(TreeNode root) {
        if (root == null) return 0;
        getMaxDep(root);
        return res;
    }
    public int getMaxDep(TreeNode node) {
        if (node == null) {
            return 0;
        } 
        int leftDep = getMaxDep(node.left);
        int rightDep = getMaxDep(node.right);
        res = Math.max(res, leftDep + rightDep); // 计算经过本节点的最大深度
        return Math.max(leftDep, rightDep) + 1;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Django】初识Django快速上手

Django简介 Django是一个高级的、开源的Python Web框架&#xff0c;旨在快速、高效地开发高质量的Web应用程序 https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django/Introduction 安装Django pip install Django如果要知道安装的Django的版本&#xff0c;可…

关于两步到位Chrome永久停止更新

全程就两个步骤&#xff01;&#xff01;敲重点&#xff01;&#xff01;&#xff01; 好使记得点赞关注我&#xff01; 1.找到Chrome包下的hosts文件 默认路径大概是 C:\Windows\System32\drivers\etc\hosts &#xff0c;不记得了可以通过Everything查找 在hosts 文件中 …

移动端日志采集与分析最佳实践

前言 做为一名移动端开发者&#xff0c;深刻体会日志采集对工程师来说具有重要意义&#xff0c;遇到问题除了 debug 调试就是看日志了&#xff0c;通过看日志可以帮助我们了解应用程序运行状况、优化用户体验、保障数据安全依据&#xff0c;本文将介绍日志采集的重要性、移动端…

开源博客项目Blog .NET Core源码学习(19:App.Hosting项目结构分析-7)

本文学习并分析App.Hosting项目中后台管理页面的主页面。如下图所示&#xff0c;开源博客项目的后台主页面采用layui预设类layui-icon-shrink-right设置样式&#xff0c;点击主页面中的菜单&#xff0c;其它页面采用弹框或者子页面形式显示在主页面的内容区域。   后台主页面…

JavaScript算法描述【排序与搜索】六大经典排序|合并两个有序数组|第一个错误的版本

&#x1f427;主页详情&#xff1a;Choice~的个人主页 &#x1f4e2;作者简介&#xff1a;&#x1f3c5;物联网领域创作者&#x1f3c5; and &#x1f3c5;阿里专家博主&#x1f3c5; and &#x1f3c5;华为云享专家&#x1f3c5; ✍️人生格言&#xff1a;最慢的步伐不是跬步&…

C++ 笔试练习笔记【1】:字符串中找出连续最长的数字串 OR59

文章目录 OR59 字符串中找出连续最长的数字串题目思路分析实现代码 注&#xff1a;本次练习题目出自牛客网 OR59 字符串中找出连续最长的数字串 题目思路分析 首先想到的是用双指针模拟&#xff0c;进行检索比较输出 以示例1为例&#xff1a; 1.首先i遍历str直到遍历到数字&a…

unity 专项一 localPosition与anchoredPosition(3D)的区别

一 、RectTransform 概念 1、RectTransform继承自Transform&#xff0c;用于描述矩形的坐标(Position)&#xff0c;尺寸(Size)&#xff0c;锚点(anchor)和中心点(pivot)等信息&#xff0c;每个2D布局下的元素都会自动生成该组件。 2、当我们在处理UI组件时&#xff0c;往往容易…

【微信小程序调用百度API实现图像识别实战】-前后端加强版

前言&#xff1a;基于前面两篇图像识别项目实战文章进行了改造升级。 第一篇 入门【微信小程序调用百度API实现图像识别功能】----项目实战 第二篇 前后端结合 【微信小程序调用百度API实现图像识别实战】----前后端分离 这一篇主要讲述的是在第二篇的基础上新增意见反馈功能&a…

ZooKeeper 搭建详细步骤之一(单机模式)

搭建模式简述 ZooKeeper 的搭建模式包括单机模式、集群模式和伪集群模式&#xff0c;分别适用于不同的场景和需求&#xff0c;从简单的单节点测试环境到复杂的多节点高可用生产环境。在实际部署时&#xff0c;应根据系统的可用性要求、数据量、并发负载等因素选择合适的部署模式…

mysql UNION 联合查询

mysql UNION 联合查询 业务需要拉数据&#xff0c;这里需要对查询不同格式的数据进行组装&#xff0c;此处采用联合查询 注意1&#xff1a;null as 设备关爱 &#xff0c;结果为null&#xff0c;表头为设备关爱 注意2&#xff1a; UNION 或者 UNION ALL 联合查询自行选用 注意3…

新开的拼多多店铺怎么运营

今天给大家分享一下如何在拼多多平台上开设并运营一家店铺。不管你是创业者还是小型商家&#xff0c;相信这个话题都会对你有所帮助。 拼多多新店需要做些推广提高店铺权重 新店用3an推客做推广比较好 3an推客是给商家提供的营销工具&#xff0c;3an推客CPS推广模式由商家自主…

Int4:Lucene 中的更多标量量化

作者&#xff1a;来自 Elastic Benjamin Trent, Thomas Veasey 在 Lucene 中引入 Int4 量化 在之前的博客中&#xff0c;我们全面介绍了 Lucene 中标量量化的实现。 我们还探索了两种具体的量化优化。 现在我们遇到了一个问题&#xff1a;int4 量化在 Lucene 中是如何工作的以…

(七)Servlet教程——Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器&#xff0c;假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”&#xff0c;选择其中的“应用程序服务器” 4. 点击“”按钮…

每日OJ题_DFS回溯剪枝⑦_力扣77. 组合

目录 力扣77. 组合 解析代码 力扣77. 组合 77. 组合 难度 中等 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,…

数据结构与算法(Java版) | 详解十大经典排序算法之一:插入排序

接下来&#xff0c;我来给大家讲解第三种排序算法&#xff0c;即插入排序。 基本介绍 首先&#xff0c;我们来看下插入排序的基本介绍。 插入排序&#xff0c;其属内部排序法&#xff0c;是对于欲排序的元素以插入的方式来找寻该元素的适当位置&#xff0c;以便最终达到排序…

基于Springboot的考研资讯平台

基于SpringbootVue的考研资讯平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 考研资讯 报考指南 资料信息 论坛信息 后台登录 考研资讯管理 学生管理 资…

Python数据分析实验二:Python数据预处理

目录 一、实验目的与要求二、实验任务三、主要程序清单和运行结果&#xff08;一&#xff09;对chipotle.csv文件的销售数据进行分析&#xff08;二&#xff09;对描述泰坦尼克号成员的信息进行可视化和相关分析 四、实验体会 一、实验目的与要求 1、目的&#xff1a;   掌握…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景&#xff0c;某地出现突发事件&#xff0c;当地村委会、负责人等在积极研究和搜集解决该事件的解决方案&#xff0c;你也决定参与其中&#xff0c;提交提案&#xff0c;建议一些解决方法。为了和其他村民的提案做区分&#xff0c;你的…

eclipse 如何创建python文件

一、准备 1.平台要求&#xff1a; 电脑除了要安装eclipse软件和Python语言包之外&#xff0c;还需要将Python集成到eclipse软件中&#xff0c;网上有很多的方法&#xff0c;这里就不细细介绍如何集成了。 在下面界面中可以看到自己已经安装了继承插件。具体方法见步骤2&…

构建数字化银行:现代化总架构探究

随着科技的迅速发展和用户需求的不断变化&#xff0c;传统银行业正迎来一场数字化转型的浪潮。在这个数字化时代&#xff0c;银行需要构建现代化的总架构&#xff0c;以适应快速变化的市场环境和客户需求。本文将深入探讨数字化银行的总架构设计理念、关键技术以及实践经验&…