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

树形 DP

二叉树的最大深度

image
image

解题思路

二叉树的最大深度 = max(左子树的最大深度,右子树的最大深度)+1

代码实现

点击查看代码
class Solution {
public:int maxDepth(TreeNode* root) {if (root == nullptr) {return 0;}return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

二叉树的直径

image
image

解题思路

定义节点的高度:从该节点到最远叶子节点的边数。空节点的高度为-1,叶子节点的高度为0。
一个节点的高度 = max(左子树高度,右子树高度)+1

对每个节点,计算【经过该节点的最长路径】:左子树高度 + 右子树高度 + 2

代码实现

点击查看代码
class Solution {
public:int diameterOfBinaryTree(TreeNode* root) {int ans = 0;auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root == nullptr) {return -1;}int l_len = dfs(root->left);int r_len = dfs(root->right);ans = max(ans, l_len + r_len + 2);return max(l_len, r_len) + 1;};dfs(root);return ans;}
};
  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

二叉树中的最大路径和

image

代码实现

点击查看代码
class Solution {
public:int maxPathSum(TreeNode* root) {int ans = -INT_MAX;auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root == nullptr) {return 0;}int l_val = dfs(root->left);int r_val = dfs(root->right);ans = max(ans, l_val + r_val + root->val);return max(max(l_val, r_val) + root->val, 0);};dfs(root);return ans;}
};

相邻字符不同的最长路径

image
image

解题思路

思路1

遍历 \(x\) 的子树,把最长链的长度都存到一个列表中,排序,取最大的两个。

思路2

遍历 \(x\) 的子树的同时维护最长链 \(a\) 和 次长链 \(b\)
如何一次遍历找最长+次长?

  1. 如果次长在前面,最长在后面,那么遍历到 最长的时候就能算出最长+次长
  2. 如果最长在前面,次长在后面,那么遍历到 次长的时候就能算出最长+次长

战略性放弃

打家劫舍 III

image
image

解题思路

选或不选

  1. 选当前节点,左右儿子都不能选
  2. 不选当前节点,左右儿子可选可不选

提炼状态
对于每个节点,都有选或不选两个状态

选 = 左不选的最大点 + 右不选的最大点 + 当前节点值
不选 = max(左选,左不选) + max(右选,右不选)

最终答案:对于根节点,选或不选

代码实现

点击查看代码
class Solution {
public:int rob(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* root) -> pair<int, int> {if (root == nullptr) {return {0, 0}; // 选 不选}auto l = dfs(root->left);auto r = dfs(root->right);int rob = l.second + r.second + root->val;int not_rob = max(l.first, l.second) + max(r.first, r.second);return {rob, not_rob};};auto res = dfs(root);return max(res.first, res.second);    }
};
  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

推广到一般树
选 = \(\sum\)不选子节点 + 当前节点值
不选 = \(\sum\)max(选子节点,不选子节点)

http://www.jsqmd.com/news/410553/

相关文章:

  • oem 自动化安装 - a
  • 每日面试题分享199:什么是JS中的作用域?
  • 【收藏必备】Agent Skills机制详解:为AI Agent安装“新技能“的完整教程
  • 解析 OceanBase 生态工具链 —— OAT / obd / OCP / obshell
  • 2026热门推拉窗品牌推荐:阳光房/平开门/推拉窗/推拉门/铝合金门窗/四川门窗品牌/性价比门窗/成都门窗/系统门窗/选择指南 - 优质品牌商家
  • 2026普通人AI逆袭完全指南:不懂代码,如何把大模型变成你的“超级员工”?
  • Comsol 方形锂电池电化学—热耦合模型充放电循环热仿真探索
  • [项目]滩涂光伏电站数据采集与监控系统
  • styled-components 标签模板深度解析
  • DS4Windows革新性全攻略:让PS4手柄在PC平台完美适配的技术指南
  • 2026成都区域优质回收商家推荐指南:黄金高于市场价回收/黄金高价回收无套路/名烟名表高价回收/名表寄卖回收/名贵烟洒回收/选择指南 - 优质品牌商家
  • 探秘丰田EVT功率分流混合动力能耗电耗Simulink分析模型
  • 2026年比较好的铁艺栏杆/金属栏杆如何选生产商推荐(精选) - 行业平台推荐
  • 2026年靠谱的数据中心机柜空调/通信柜机柜空调哪家强生产厂家实力参考 - 行业平台推荐
  • UABEA全攻略:Unity资源包提取工具核心功能与实战指南
  • 2026年比较好的手持激光打标机/紫外激光打标机高评价直销厂家采购指南推荐(高评价) - 行业平台推荐
  • 解决QQ音乐加密格式限制:QMCDecode音频格式转换工具全解析
  • 对接上海智推时代 GEO 服务,2026年官方联络方式速查 - 速递信息
  • [项目]热轧循环水系统智能监控与数据采集平台(SCADA)
  • 【深度收藏】告别硬编码!AI Agent如何改变我们开发软件的方式
  • 贵州优质养老机构最新盘点:福贵康护理院领衔,医养结合更安心 - 深度智识库
  • 收藏!做大模型应用3年,从沉迷LLM暴力美学到落地祛魅,小白/程序员必看避坑指南
  • 资源分配:企业 ICT 系统三级规划与路由优化实践
  • [项目]新疆某厂加热辊上位机
  • 收藏!从春晚机器人看AI风口:普通人也能入门的大模型赛道,年薪可达45W!
  • 如何快速入门大模型?写给小白的大模型技术学习路线!
  • 2026年口碑好的沥青再生剂路面材料/改色路面材料生产厂家实力参考哪家强(更新) - 行业平台推荐
  • PyCharm2025.1.2破解(仅供学习交流 ,若侵联删)
  • 媒介宣发解锁 GEO 新玩法 智能工具让本地传播更精准
  • 程序员转行AI大模型教程(非常详细)