LeetCode hot100-543 二叉树的直径

复制代码
class Solution {
public:
    int diameterOfBinaryTree(TreeNode* root) {
        ans=0;
        maxdep(root);
        return ans;
    }
private:
    int ans;
    int maxdep(TreeNode* root){
        if(!root) return 0;
        int l=maxdep(root->left);
        int r=maxdep(root->right);
        ans=max(ans,l+r);
        return (l>r?l:r)+1;
    }
};
复制代码
int maxDepth(TreeNode* root) {
    if (!root) return 0;
    return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}

这个返回的是节点数

  • 空节点:0

  • 单节点:1

  • 两层树:2

复制代码
    1
   / \
  2   3
 / \
4   5

对于节点 2:

  • 左子树高度 = 1(节点4)

  • 右子树高度 = 1(节点5)

  • 经过节点2的最长路径 = 左高度 + 右高度 = 1 + 1 = 2(边数)

所以代码中的 l + r 实际上加的是节点数 ,但结果恰好等于边数

复制代码
ans = max(ans, l + r);

因为:

  • l = 左子树的高度(节点数)

  • r = 右子树的高度(节点数)

  • 经过当前节点的路径 = 左子树节点数 + 右子树节点数 = 边数

复制代码
return (l > r ? l : r) + 1;
          ↑              ↑
    孩子最大深度    加上当前节点到孩子的边
  • lr:孩子到他们最深后代的距离(边数)

  • +1:当前节点到孩子的 1 条边

  • 返回值:当前节点到最深后代的距离(边数)

相关推荐
晴天的雨.99216 分钟前
类和对象下(内部类,匿名对象,对象拷贝时的编译器优化)
开发语言·c++·算法
旖旎夜光35 分钟前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
RisunJan41 分钟前
Android 面试知识点整理
android·面试·职场和发展
一条大祥脚42 分钟前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
奈斯先生Vector1 小时前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
2601_956121971 小时前
Bellman-ford算法
算法
叠层归一研究院1 小时前
基于区分本源的此刻存在唯一性本体论推演
人工智能·算法
luj_17681 小时前
尾椎藏今生记忆?骨盆对应不确定性
开发语言·网络·c++·经验分享·算法
深圳多奥智能一卡(码、脸)通系统1 小时前
智能梯控SDK可直接用于第三方开发对接的接口文档说明书
服务器·前端·算法