Leetcode(543)——二叉平衡树

【C++】二叉树的直径 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 思路 求左右孩子深度的和的最大值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *ri 阅读详情

Leetcode(543)——二叉平衡树

题目

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例:

给定二叉树
在这里插入图片描述
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

注意:两结点之间的路径长度是以它们之间边的数目表示。

题解

方法一:深度优先搜索

思路

​​  首先我们知道一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。

​​  而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。

在这里插入图片描述

​​  如图我们可以知道路径 [9,4,2,5,7,8][9, 4, 2, 5, 7, 8][9,4,2,5,7,8] 可以被看作以 222 为起点,从其左儿子向下遍历的路径 [2,4,9][2, 4, 9][2,4,9] 和从其右儿子向下遍历的路径 [2,5,7,8][2, 5, 7, 8][2,5,7,8] 拼接得到。

​​  假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 LLL (即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 RRR (即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R+1L+R+1L+R+1。

​​  我们记节点 node\textit{node}node 为起点的路径经过节点数的最大值为 dnoded_{\textit{node}}dnode​,那么二叉树的直径就是所有节点 dnoded_{\textit{node}}dnode​ 的最大值减一。

​​  最后的算法流程为:我们定义一个递归函数 depth(node)depth(node)depth(node) 计算 dnoded_{\textit{node}}dnode​,函数返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 LLL 和 RRR ,则该节点为根的子树的深度即为

max(L,R)+1 max(L,R)+1 max(L,R)+1

​​  该节点的 dnoded_{\textit{node}}dnode​ 值为

L+R+1 L+R+1 L+R+1

​​  递归搜索每个节点并设一个全局变量 ansansans 记录 dnoded_\textit{node}dnode​ 的最大值,最后返回 ans−1ans-1ans−1 即为树的直径。

代码实现
/**
 * 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 {
    int maxL = 0;
    int height(TreeNode* root){
        // 一棵二叉树的直径,该路径一定是以该二叉树的某一结点为根节点的子树,且值为其左右子树的高度相加。
        // 一棵二叉树的直径可能穿过也可能不穿过根结点————指是否以 root 为根结点。
        // 所以只需要在遍历每个结点时,求出其左右子树的高度相加的值。
        if(root == nullptr) return 0;
        int left = height(root->left), right = height(root->right);
        maxL = max(maxL, left + right);
        return max(left, right) + 1;
    }
public:
    int diameterOfBinaryTree(TreeNode* root){
        if(root == nullptr) return 0;
        height(root);
        return maxL;
    }
};
复杂度分析

时间复杂度:O(N)O(N)O(N),其中 NNN 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
空间复杂度:O(Height)O(Height)O(Height),其中 HeightHeightHeight 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height)O(Height)O(Height)。

LeetCode 二叉树的直径 文章目录二叉树的直径题目解题思路代码实现实现结果 二叉树的直径 题目来源:https://leetcode-cn.com/problems/diameter-of-binary-tree/ 题目 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 注意:两结点之间的路径长度是以它们之间边的数目表示。 解 立即下载

相关推荐

非华为电脑与MatePad Pro多屏协同实战:从安装管家到攻克连接难题

本文详细介绍了在非华为电脑上安装华为电脑管家并实现与MatePad Pro多屏协同的完整指南。从安装步骤、常见连接失败解决方案到华为账号绑定技巧,提供了实用的操作方法和硬件优化建议,帮助用户攻克连接难题,提升多屏协同的稳定性和流畅度。

weixin_30263073的博客 233

leetcode 543 二叉树的直径

题目描述 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 注意:两结点之间的路径长度是以它们之间边的数目表示。 题解 /** * Definition for a binary tre

qq_41202486的博客 277

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5103

Leetcode 543. 二叉树的直径 C++

Leetcode 543. 二叉树的直径 题目 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 **注意:**两结点之间的路径长度是以它们之间边的数目表示。 题解 后序遍历,获取左右子

weixin_43750513的博客 312

【头歌实训:逆置顺序表】

根据提示,在右侧编辑器补充函数rev的代码,使用顺序表L的空间就地逆置L。},要求时间复杂度为O(n),空间复杂度为O(1)。第一行为顺序表逆置之前的元素。每个数据后一个空格。第二行为顺序表逆置之后的元素。每个数据后一个空格。本关任务:设计一个算法,将一个顺序表L的元素{a。第一行为顺序表中元素个数n。第二行为空格隔开的n个整数。开始你的任务吧,祝你成功!

guang_Lee的博客 998

示波器学习(一):示波器的作用、类型和基本结构

示波器的作用、使用场景;示波器的类型和基本结构介绍

qq_41300605的博客 9140

LeetCode第543题——二叉树最大直径(Java)

二叉树的最大直径

m0_52861211的博客 205

java写一个多人线上聊天室

课程作业谔谔

weixin_51614848的博客 1136

leetcode 543:二叉树的直径

leetcode 543:二叉树的直径 543. 二叉树的直径 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 **注意:**两结点之间的路径长度是以它们之间边的数目表示。 Relate

yingmu__的博客 804

YOLO11涨点优化:SPPF原创自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1869

ADS基础教程24 - Gerber文件的导入

一、引言二、基本概念1.仿真文件下载2.仿真文件介绍二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题四、总结选择。通过本文章结束,可以了解ADS中如何将导入Gerber文件,并且对导入的铜皮进行合并。下一步就针对导入的文件进行层叠设置和编辑。END!}}END!

XZ_ZC的博客 3053

力扣543.二叉树的直径、102.二叉树的层序遍历、108.将有序数组转换为二叉搜索树、98.验证二叉搜索树

把之前求解最大深度的思路套用到这一道题当中,只是增加一个结果变量,用于返回所要求的直径,这个直径理论上应当是整个树中左子树和右子树最大深度之和,但不只局限于是根节点,在深度极度偏斜的情况下可能是其他节点的左子树或者右子树深度之和。

qq_66799283的博客 256

LVGL hal disp(porting display)

LVGL本身是没有对接最终的显示框架的,所以到具体的某个平台上,需要自行porting。

Bigan(安)的博客 2097

树形dp求树的直径

题目描述 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。 示例 1: 输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6 示例 2: 输入:root = [-10,9,20,null,null,

IAMLSL的博客 4217

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode第543题 二叉树的直径

题目描述 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 解题思路 1、题意理解:求二叉树的直径,如上图示例可知,我们看作节点1的左子树的深度 + 节点1的右子树的深度 2、代码逻辑:使用递归求出任意节点的最大深度,并且记录(L+R)的最大值 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; *

LiuXiaoXueer的博客 254

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【图论C++】树的直径(DFS 与 DP动态规划)

树上 最远的两个节点之间 的距离被称为 **树的直径**,连接这两个点的路径 被称为 **树的最长链**。

qq_73928885的博客 1759

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

leetcode刷题(第543题)——二叉树的直径

一、题目 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点 路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 二、示例 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。 三、思路 思路二:该题可以使用一个值来保存最大的值,也是使用递归来设置。不过这次只使用一次递归,时间复杂度和空间复杂度都很低。 四、代码

weixin_47450807的博客 918

Leetcode-543 二叉树的直径

(2) 分别记录下以每个节点作为根节点的左右子树的直径;(1) 定义一个lambda表达式函数体。,返回以当前节点为根节点的最大深度;(3) 递归调用找出最大值。

qewa132的博客 956

树的直径

树的直径学习笔记 树的直径 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和。树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。后者通常也可称为直径,即直径是一个 数值概念,也可代指一条路径 树的直径通常有两种求法,时间复杂度均为O(n)。我们假设树以N个点N-1条边的无向图形式给出,并存储在邻接表中。 树的直径求法 树形DP求树的直径...

qq_26518655的博客 278

二叉树的直径C++

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。这条路径可能经过也可能不经过根节点 root。给你一棵二叉树的根节点,返回该树的 直径。两节点之间路径的 长度 由它们之间边数表示。直径和二叉树的最大深度不一样。

monicaaaaan的博客 206

LeetCode 算法:二叉树的直径 c++

LeetCode 算法:二叉树的直径 c++

世界那么大,我想去看看~【随心更新,看世界去了😄】 1879

LeetCode 543. Diameter of Binary Tree

Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root. Example: Given a binary tree R

weixin_44610959的博客 160

【leetcode】543 二叉树的直径,递归解以及栈解

一棵二叉树的直径长度是任意两个结点路径长度中的最大值。题目的意思是,求树里最长的路径,也就是求左右子树深度之和的最大节点,需要注意的是这个节点不一定经过根噢。链接:https://leetcode.cn/problems/diameter-of-binary-tree。我的思路是,遍历这棵树每个节点,这样每个节点的左右子树深度和都能求到,然后作比较即可。返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。

不完美的红烧肉的博客 469

leetcode543--二叉树的直径

leetcode543--二叉树的直径

bdn_nbd的博客 576

树形DP-树的直径与重心

树的直径与重心直径定义树形DP解树的直径注意重心定义树形DP解树的重心 直径 定义 给定一颗树T=(V,E)T=\left(V,E\right)T=(V,E) 直径为maxlen(u,v)(u,v∈V)maxlen(u,v)(u,v\in V)maxlen(u,v)(u,v∈V) 树的直径普遍有两种求法,一个是两边bfs/dfsbfs/dfsbfs/dfs另一个就是树形DP 树形DP解树的直径 这颗树的直径很明显,就是(8,14)(8,14)(8,14) 而如何用代码实现呢? 首先令: fi,1f_{i,

柴春阳的博客 460

树形dp

文章目录树形dp1.算法分析2. 典型例题2.1 统计树上信息:树的直径、树的中心、树的重心2.1.1 母题2.1.2 树的中心(二次扫描与换根法)2.1.3 树的重心2.1.4 树的直径2.2 树形背包问题 树形dp 1.算法分析     在树上统计一些信息,可以使用树形dp来处理,一般的写法有递归和递推,递归写法最为常见。 常见的问题有: 求树的直径、树的重心、树的中心 树形背包dp 二次扫描与换根法 2. 典型例题 2.1 统计树上信息:树的直径、树的中心、树的重心 2.1.1 母题 acwing

m0_49959202的博客 317
上一篇: Leetcode(110)——平衡二叉树
下一篇: Leetcode(437)——路径总和 III
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值