2024/5/25 阴天。这几天睡眠质量都非常好,一切似乎都在慢慢上升。先把题做了
1、题目描述
2、逻辑分析
题目要求就是给一个二叉树,求出两个节点之间的最大长度即为二叉树的直径。怎么做呢?我想不出来。看一下题解吧。题解给出的解法是深度优先搜索。我们来看看大致思路:
比如我们示例1给出的二叉树:我们知道[4,2,1,3]和[5,2,1,3]是最大长度即直径。那么我们可以将根节作为起点,搜索左边的儿子和右边的儿子,左边长度记为L,右边长度记为R。左边可以搜出[4,2]和[5,2],右边可以搜出[3]。那么最大长度为L + R + 1,即为max,而最终的直径为max - 1。递归找出最大的那个即为最终结果,下面看代码
3、代码演示
int maxd ;
public int diameterOfBinaryTree(TreeNode root) {
maxd = 1;
depth(root);
return maxd - 1;
}
public int depth(TreeNode root ){
if(root == null){
return 0;
}
int L = depth(root.left);
int R = depth(root.right);
maxd = Math.max(maxd, L + R + 1);
return Math.max(L , R ) + 1;
}
在IDE中运行一遍就顺畅了许多,递归这一思想真的很重要。时间复杂度:O(n),空间复杂度:O(height),height为树的高度。
ok,做完啦,再见!