题目:543. 二叉树的直径
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
示例 1:
输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
示例 2:
输入:root = [1,2]
输出:1
提示:
树中节点数目在范围 [1, 104] 内
-100 <= Node.val <= 10
解题
方式一:深度优先遍历
这道题还是比较简单的,就是遍历二叉树,而遍历二叉树的模板就是:深度优先遍历。那我们再梳理下一个关系:直径长度就是路径经过节点数的最大值(最长路径)减一,而路径经过的节点数的最大值 就是 这个节点的左右子树的最大深度相加再+1,所以数学关系:直径长度 = 这个节点的左右子树的最大深度相加。
/**
* 时间复杂度:O(n)
* 空间复杂度: O(Height),其中 HeightHeightHeight 为二叉树的高度。
由于递归函数在递归过程中需要为每一层递归函数分配栈空间,
所以这里需要额外的空间且该空间取决于递归的深度,
而递归的深度显然为二叉树的高度,
并且每次递归调用的函数里又只用了常数个变量,
所以所需空间复杂度为 O(Height)
*/
class Solution {
// 直径
int diameter = 0;
public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return diameter ;
}
// 返回当前节点的深度
private int depth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = depth(root.left);
int rightDepth = depth(root.right);
// 记录最长直径
diameter = Math.max(leftDepth + rightDepth, diameter);
// 返回当前节点的最大深度
return Math.max(leftDepth, rightDepth) + 1;
}
}