当前位置: 首页 > news >正文

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

问题: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.mrgr.cn/news/34183.html

相关文章:

  • 网络远程操控
  • STM32(hal库)在串口中,USART和uart有什么区别?
  • pycharm报错:no module named cv2.cv2
  • SpringBoot如何集成WebSocket
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • 【鸿蒙开发】第四章 ArkTS语言UI范式-基础语法
  • 输出Hate-C语言
  • 【Ambari自定义组件集成】Bigtop320集成Ranger实战
  • GPT-4o能玩《黑神话》!精英怪胜率超人类,无强化学习纯大模型方案
  • ChatGPT与R语言融合技术在生态环境数据统计分析、绘图、模型中的实践与进阶应用
  • Debian安装mysql遇到的问题解决及yum源配置
  • 苹果和香蕉联合食用,益处最大,能控制血压水平,高血压死亡风险降低 40%!
  • C#知识|继承与多态
  • 【2024.09】关于 UMLS 在支持大型语言模型提出的诊断生成中的作用
  • spring 注解 - @NotNull - 确保字段或参数值不为 null
  • C++学习,命令空间
  • redis常用五种数据类型的常用指令
  • 核心复现—计及需求响应的区域综合能源系统双层优化调度策略
  • 网安新声 | 黎巴嫩BP机爆炸事件带来的安全新挑战与反思
  • ubuntu安装gitlab-runner
  • 力扣647-回文子串(Java详细题解)
  • 光控资本:沪指涨0.72%,煤炭、银行板块拉升,车路云概念活跃
  • Linux: eBPF: libbpf-bootstrap-master 编译
  • 保姆级 Stable Diffusion 教程,看完这篇就够了!
  • 多语言文本 AI 情感分析 API 数据接口
  • JSP 指令标识和脚本标识的使用