1、题目描述
2、题目分析
根据题目描述,可以分析出:
(1)直径长度,等价于任意两个节点路径长度中的最大值,那么也就是求过这个节点的【左子树长度】+【右子树长度】的汇总数里面的最大值
(2)可以不经过根节点
题目解法:
class Solution {
//二叉树深度的应用
//直径获取(获取最大值设置为全局变量,动态比较后更新)
int maxDepth = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) return 0;
maxDepth(root);
return maxDepth;
}
private int maxDepth(TreeNode root){
if(root == null) return 0;
//分别获取左右子树的深度
int left = maxDepth(root.left);
int right = maxDepth(root.right);
//直径获取,当前节点的左右子树汇总和深度
maxDepth = Math.max(maxDepth, left+right);
//求二叉树深度
return Math.max(left,right)+1;
}
}
复杂度分析
时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
空间复杂度:O(Height),其中 Height为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height)。