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

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

两节点之间路径的 长度 由它们之间边数表示。

示例 1:

LeetCode543. 二叉树的直径(2024秋季每日一题 42)_链表

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

输入:root = [1,2]
输出:1

提示:

树中节点数目在范围 LeetCode543. 二叉树的直径(2024秋季每日一题 42)_树的直径_02
LeetCode543. 二叉树的直径(2024秋季每日一题 42)_递归_03


思路:

  • 维护一个 res 全局变量,记录最终结果(直径路径上的节点数量),res - 1,即路径长度
  • 递归求出每个节点的直径,取最大值,即最终答案
  • dfs 遍历二叉树,对于当前节点,分别递归 左子树 和 右子树,计算 左/右 子树的深度
  • 对于当前节点来说,直径 = 左depth + 右depth + 1(当前节点),当前深度等于 d = max(左depth,右depth) + 1
  • 将当前深度返回(使得每个节点都可以计算直径),直径通过更新 res 变量维护
/**
 * 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 {
public:
    int diameterOfBinaryTree(TreeNode* root) {        
        int res = 0;
        int x = dfs(root, res);
        return max(res, x) - 1;
    }
    int dfs(TreeNode * root, int &res){
        if(root == nullptr) return 0;
        int l = dfs(root -> left, res);
        int r = dfs(root -> right, res);
        res = max(res, l + r + 1);
        return max(l, r) + 1;
    }
};