给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
示例 1:
输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
示例 2:
输入:root = [1,2]
输出:1
提示:
树中节点数目在范围 内
思路:
- 维护一个 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;
}
};