力扣最热一百题——二叉树的直径

news2024/9/20 8:00:28

目录

题目链接:543. 二叉树的直径 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:深度优先搜索

实现思路:

关键点:

Java写法:

运行时间

C++写法:

运行时间

总结


题目链接:543. 二叉树的直径 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

示例

示例 1:

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

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

提示:

  • 树中节点数目在范围 [1, 10^{4}] 内
  • -100 <= Node.val <= 100

解法一:深度优先搜索

        直径是二叉树中任意两节点间最长路径的长度。思路是通过深度优先遍历来逐个节点进行递归计算,最终找出最长路径。

实现思路:

  1. 全局变量res的作用

    • 该变量用于动态保存当前发现的最长路径。初始值设为0,但在进入根节点时被初始化为1,因为树至少包含根节点。
  2. diameterOfBinaryTree方法

    • 入口方法,接收二叉树的根节点作为输入。
    • 首先检查根节点是否为空,若为空,则二叉树的直径为0
    • 调用辅助方法depthFirst,以深度优先的方式遍历整棵树。
    • 最终返回res - 1,这是因为路径的长度是节点数减1。
  3. 深度优先遍历 depthFirst

    • 每个节点通过递归方式遍历其左子树和右子树,分别获取左子树和右子树的深度。
    • 更新全局变量res,这个过程通过比较当前节点左子树和右子树的深度和当前保存的res,取最大的那个值。res的更新逻辑是左子树深度 + 右子树深度 + 1(代表当前节点)。
    • 返回当前节点的深度,即左子树和右子树深度的最大值加1,作为给上层节点使用的深度值。

关键点:

  • 深度优先搜索 (DFS):通过递归的方式遍历每一个节点。
  • 动态维护最长路径:每次计算出左右子树的深度时,更新全局变量res,并确保保存的是最长路径。
  • 最终结果调整:二叉树的直径是节点数减去1(路径的长度是节点数减1),因此最后返回res - 1

Java写法:

/**
 * Definition for a binary tree node.
 * 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 {
    // 定义一个全局变量用于动态保存res
    int res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if(root != null){
            res = 1;
        }else{
            return 0;
        }
        // 深度优先遍历
        depthFirst(root);
        // 由于我们最终得到是节点的个数
        // 而题目要的是路径的长度,那么只需要-1即可
        return res - 1;

    }
    /**
        深度优先遍历
     */
    public int depthFirst(TreeNode node){
        // 非空判断
        if(node == null){
            return 0;
        }
        // 遍历左子树
        int leftDepth = depthFirst(node.left);
        // 遍历右子树
        int rightDepth = depthFirst(node.right);
        // 动态维护res,由于我们要找的是最长两个节点的长度
        // 那么res的值=左子树的深度+右子树的深度+node节点(也就是1)
        res = Math.max(res, leftDepth + rightDepth + 1);
        // 返回当前树的深度给上一节点
        return Math.max(leftDepth,rightDepth) + 1;
    }
}

运行时间

C++写法:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    // 定义一个全局变量用于动态保存res
    int res = 0;
    int diameterOfBinaryTree(TreeNode* root) {
        if(root == NULL){
            return 0;
        }else{
            res = 1;
        }
        // 深度优先遍历
        depthFirst(root);
        // 由于我们最终得到是节点的个数
        // 而题目要的是路径的长度,那么只需要-1即可
        return res - 1;
    }
    /**
        深度优先遍历
     */
    int depthFirst(TreeNode* node){
        // 非空判断,结束条件
        if(node == NULL){
            return 0;
        }
         // 遍历左子树
        int leftDepth = depthFirst(node->left);
         // 遍历右子树
        int rightDepth = depthFirst(node->right);
        // 动态维护res,由于我们要找的是最长两个节点的长度
        // 那么res的值=左子树的深度+右子树的深度+node节点(也就是1)
        res = max(res, leftDepth + rightDepth + 1);
         // 返回当前树的深度给上一节点
        return max(leftDepth,rightDepth) + 1;
    }
};

运行时间


总结

        其实就是深度优先搜索的一个扩展现实,多维护了一个res结果,在每次的深度优先搜索的过程中动态的维护一个res,来坚持判断当前两个最远的节点的值,这里最远的节点的值,肯定是存在于两个叶子结点之间的(其实我也在思考这句话对不对,我目前分析来说是对的,没有找到反例,不知道各位同学、大佬能不能发现这句话的问题,欢迎指正),这就是这道题目的关键点所在。

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

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

相关文章

优思学院|精益工程师是做什么的? 前途好吗?

如果你有经常留意招聘网站&#xff0c;你或者会偶尔看到精益工程师这个职位&#xff0c;事实上精益工程师这个岗位不多&#xff0c;但却有很多人会觉得精益工程师前途无限&#xff0c;到底为什么呢&#xff1f; 精益工程师的职责主要围绕着帮助企业减少浪费、优化流程、提升效…

第二证券:股票是谁控制涨跌?股票涨跌如何计算?

股票是谁控制涨跌&#xff1f; 1、上市公司基本面 上市公司基本面包括盈利才干、成长性、财务状况、管理水平、行业远景、商场竞争、工业政策等。这些方面是决定股价长时间趋势的首要要素&#xff0c;一般来说基本面好的公司&#xff0c;其股价会随着成绩的提高而上涨。 2、…

solidworks案例4-20240911

使用到的命令&#xff1a;拉伸&#xff0c;拉伸切除

Linux常用命令笔记

执行查看帮助命令 1.1 Linux命令的格式 命令名称 [命令参数] [命令对象] 命令名称、命令参数、命令对象之间请用空格键分隔命令对象一般是指要处理的文件、目录、用户等资源&#xff0c;而命令参数可以用长格式&#xff08;完整的选项名称&#xff09;&#xff0c;也可以用短…

word文档的读入(6)

上一个方式&#xff0c;虽然能获取到标准答案和所对应的学生答案&#xff0c;但代码不够简单和优雅。这时&#xff0c;可以用另一种方式来实现&#xff1a;遍历索引。 定义 简单来说&#xff0c;enumerate()函数用来遍历一个可遍历对象中的元素&#xff0c;同时通过一个计数器…

基础——使用windows自带远程桌面远程linux

基础——使用windows自带远程桌面远程linux_win11远程桌面登陆linux集群-CSDN博客文章浏览阅读1.1w次&#xff0c;点赞6次&#xff0c;收藏43次。没做配置前远程连接效果如下&#xff1a;前提&#xff1a;如果linux没有图形界面请运行一下命令yum -y groups install "GNOM…

离线语音识别芯片让家用饮水茶吧机更智能

随着科技的飞速发展&#xff0c;智能家居逐渐走进人们的生活。本文将探讨离线语音识别技术如何为家用饮水茶吧机带来智能化的全新体验。通过引入语音模块&#xff0c;家用饮水茶吧机得以实现更加便捷的操作方式&#xff0c;为用户带来更加智能的生活体验。 在如今快速发展的时…

DV证书和OV证书的区别有哪些?主要有5点

众所周知&#xff0c;SSL证书按照验证方式的不同可以分为DV SSL证书、OV SSL证书和EV SSL证书等3种&#xff0c;而对于DV SSL证书和​​​​​​​OV SSL证书的区别很多人都不知晓&#xff0c;为了便于用户选择&#xff0c;锐成信息就DV SSL证书和OV SSL证书的不同点进行一个大…

怎么设置电脑禁止访问网页/网站?一分钟教你五个方法,实现网站访问黑名单,让员工专注力满满!

"心无杂念&#xff0c;方能致远。" 怎么设置电脑禁止访问网页/网站&#xff1f;当员工的注意力频繁被社交媒体、娱乐网站等非工作相关页面吸引时&#xff0c;公司的生产力与信息安全问题便悄然而至&#xff01; 如何在保障员工适当网络自由的同时&#xff0c;构建…

Unity Apple Vision Pro 开发(九):空间锚点

XR 开发者社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程试看&#xff1a;https://www.bilibili.com/video/BV1JFHgegEb2 课程完整版&#xff0c;答疑仅社区成员可见&#xff0c;可以通过文章开头的链接加入…

0基础带你入门之Linux简介

1.Linux和Windows对比 Window很明显的特征就是有C盘、D盘登各种磁盘 我们通过点击不同的盘符&#xff0c;点击里面存储的文件进行查阅的操作 而Linux则很简单&#xff0c;只有一个根目录&#xff0c;也可以说只有一个盘&#xff0c;整个系统所有的东西都是在根目录下的 我们可…

【word】目录里面蓝色的mathtype标注“公式节(下一节)”的删除方法

mathtype加“下一节” 在编写论文或大型分章的文档时,如果对mathtype的带编号的公式添加章节序号,则需要用mathtype里面添加“下一节”的符号: 具体方法如下: 打开MathType:在Word文档中,点击工具栏中的MathType图标,打开MathType编辑器。插入分隔符: 将光标放在需要…

异形创意圆形(饼/盘)LED显示屏有什么优势,主要应用场合有哪些

在当今科技日新月异的时代&#xff0c;LED显示屏技术作为数字显示领域的重要一环&#xff0c;正以前所未有的速度推动着视觉传播的创新与发展。其中&#xff0c;异形创意圆形&#xff08;饼/盘&#xff09;LED显示屏以其独特的设计理念和广泛的应用前景&#xff0c;逐渐成为了市…

2024年图纸加密软件榜单公布!10款好用的图纸加密软件排行榜

在数字化时代&#xff0c;图纸作为工程设计、建筑规划等领域的核心资产&#xff0c;其安全性至关重要。随着网络攻击和数据泄露事件的频发&#xff0c;图纸加密软件成为了保护企业机密信息的重要工具。2024年&#xff0c;市场上涌现出了众多优秀的图纸加密软件&#xff0c;本文…

数据结构:位图

概念&#xff1a;位图本质上是个数组&#xff0c;用来存放数组&#xff0c;数组中的元素用来判断某个元素是否存在于这个位图集合中&#xff0c;当元素存在时&#xff0c;对应位的值为1&#xff1b;当元素不存在时&#xff0c;对应位的值为0 我们先判断一下下面的例子&#xf…

ai绘图软件哪个好用?值得尝试这6个

中秋佳节将至&#xff0c;当皓月当空&#xff0c;家家户户团圆之时&#xff0c;也是灵感与创意悄然涌动的时刻。 想象一下&#xff0c;一边品尝着甜蜜的月饼&#xff0c;一边用ai绘图工具绘制出心中的月宫仙境&#xff0c;岂不美哉&#xff1f; 今天&#xff0c;就让我们一起…

汽车无钥匙启动功能工作原理

移‌动管家无钥匙启动‌是一种科技化的汽车启动方式&#xff0c;它允许车主在不使用传统钥匙的情况下启动车辆。这种技术通过智能感应系统实现&#xff0c;车主只需携带智能钥匙&#xff0c;当靠近车辆时&#xff0c;车辆能够自动解锁并准备启动。启动车辆时&#xff0c;车主无…

《深度学习》【项目】 OpenCV 身份证号识别

目录 一、项目实施 1、自定义函数 2、定位模版图像中的数字 1&#xff09;模版图二值化处理 运行结果&#xff1a; 2&#xff09;展示所有数字 运行结果&#xff1a; 3、识别身份证号 1&#xff09;灰度图、二值化图展示 运行结果 2&#xff09;定位身份证号每一个数…

【VScode】配置多账户连接远程服务器

1、下载VSCODE&#xff0c;安装Remote-SSH插件 需要安装Remote-SSH插件和python插件。 2、添加服务器连接配置 这种登录的用户就是user2用户。如果想要登录其他用户&#xff0c;那么就在C:\Users\user.ssh\config文件中将其他用户的信息放在最顶端即可 3、测试链接&#xff0…