给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
需求
- 返回直径
- 长度由变数表示
实现
- 递归
代码
class Solution {
int maxDiameter = 0;
/**
* 计算二叉树的直径
* @param root 二叉树根节点
* @return 二叉树的直径长度
*/
public int diameterOfBinaryTree(TreeNode root) {
// 直径归零,递归调用时更新
maxDiameter = 0;
// 干活的函数
maxDepth(root);
return maxDiameter;
}
/**
* 计算以当前节点为根的最大深度,并更新全局最大直径
* @param node 当前节点
* @return 以当前节点为根的子树的最大深度
*/
private int maxDepth(TreeNode node) {
// 递归停止条件
if (node == null) {
return 0;
}
// 左右实现遍历
int leftDepth = maxDepth(node.left);
int rightDepth = maxDepth(node.right);
// 经过当前节点的最长路径 = 左子树深度 + 右子树深度
maxDiameter = Math.max(maxDiameter, leftDepth + rightDepth);
// 告诉父节点,返回当前节点的深度
return Math.max(leftDepth, rightDepth) + 1;
}
}
