Leetcode 543. 124. 二叉树的直径 树形dp C++实现

news/2024/9/28 9:13:27/

问题:Leetcode 543. 二叉树的直径(边权型)

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

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

/*** 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) {}* };*/

算法

        求最长链相当于左右子树的最大深度相加。所以分别求出左右子树的最大深度,然后相加放入 ans 。

时间复杂度:O(n) 。其中 n 为二叉树的节点个数。

空间复杂度:O(n) 。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。

代码:

class Solution {
public:int diameterOfBinaryTree(TreeNode* root) {int ans = 0;auto dfs = [&](auto &&dfs,TreeNode *node){if(!node)   return -1;int l_len = dfs(dfs,node->left) + 1;int r_len = dfs(dfs,node->right) + 1;ans = max(ans,l_len+r_len);return max(l_len,r_len);};dfs(dfs,root);return ans;}
};

问题:Leetcode 124. 二叉树中的最大路径和(点权型)

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

/*** 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) {}* };*/

算法

        从 root 结点开始向下递归,枚举每个 node ,返回从 node 到该条路径叶子结点的最大值,如果有分支,则比较左右大小,返回最大值。

        注意,如果最后结果是负的,则返回 0 ,因为可以放弃这段路径。

本题有两个关键概念:

        链:从叶子到当前节点的路径。其节点值之和是 dfs 的返回值。
        直径:等价于由两条(或者一条)链拼成的路径。我们枚举每个 node ,假设直径在这里拐弯,也就是计算由左右两条从叶子到 node 的链的节点值之和,去更新答案的最大值。
⚠注意:dfs 返回的是链的节点值之和,不是直径的节点值之和。

时间复杂度:O(n) ,其中 为二叉树的节点个数。

空间复杂度:O(n) 。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。

代码:

class Solution {
public:int maxPathSum(TreeNode* root) {int ans = INT_MIN;auto dfs = [&](auto &&dfs,TreeNode *node) -> int{if(!node)   return 0;int l_val = dfs(dfs,node->left);int r_val = dfs(dfs,node->right);ans = max(ans,l_val + r_val + node->val);return max(max(l_val,r_val) + node->val,0);};dfs(dfs,root);return ans;}
};


http://www.ppmy.cn/news/1530902.html

相关文章

Ubuntu22.04安装paddle

查看系统版本信息 使用命令lsb_release -a查看系统版本 rootLAIS01:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy查看系统支持的cuda版本,使用命令nvidia-smi&#…

Session和Cookie是什么?有什么区别?分布式Session问题又是什么?

Session和Cookie是什么?有什么区别?分布式Session问题又是什么? Cookie:是服务器发送到浏览器并保存在本地的数据。在浏览器下一次向同一服务器再次发送请求时,将Cookie也发送给服务器,并以此来判定这个请…

课程记录9.26

我的答案 掌握坡度、坡向、坡度变率、坡向变率、地面粗糙度和地形起伏度等基本地形因子的理论及其基于DEM的提取方法与原理。 0、 将dem文件导入arcgis10.8中, 1、 使用Arc Toolbox中的Slope工具 (Input中导入dem-》选择自己的文件夹并命名为坡度-》点…

设计模式实战——开发中常用到的单例模式

单例模式介绍 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。以下是对单例模式的介绍: 一、定义与特点 定义:单例模式(Singleton Pattern)是一种创建…

微积分复习笔记(1):单变量微积分

P.S. 本来不想分篇的&#xff0c;但居然字数超上限了。 2 π x < sin ⁡ x < x ( 0 < x < π 2 ) . \frac{2}{\pi}x<\sin x<x\ (0<x<\frac{\pi}{2}). π2​x<sinx<x (0<x<2π​). x < tan ⁡ x < 4 π x ( 0 < x < π 4 ) . x…

深入探索:MATLAB中的硬件支持包(HSP)及其应用

在MATLAB环境中&#xff0c;硬件支持包&#xff08;HSP&#xff09;扮演着至关重要的角色&#xff0c;尤其是在与硬件交互和嵌入式系统开发方面。HSP提供了一套工具和库&#xff0c;使得MATLAB能够与特定的硬件平台进行有效通信&#xff0c;实现代码的生成和优化。本文将详细介…

select查询表单

select查询语法&#xff1a; select 【1】from 【2】where 【3】 1若为*表示显示全部数据列&#xff0c;若为某一列列名则只显示本列内容&#xff08;也可为多列列名&#xff09;。若在1后面加as ‘c’&#xff0c;则表示把查询的列名换成c。 2为要查询的表表名。 3为查询的…

【CSS】鼠标 、轮廓线 、 滤镜 、 堆叠层级

cursor 鼠标outline 轮廓线filter 滤镜z-index 堆叠层级 cursor 鼠标 值说明值说明crosshair十字准线s-resize向下改变大小pointer \ hand手形e-resize向右改变大小wait表或沙漏w-resize向左改变大小help问号或气球ne-resize向上右改变大小no-drop无法释放nw-resize向上左改变…