leetcode 543:二叉树的直径
543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/
2 3
/
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
**注意:**两结点之间的路径长度是以它们之间边的数目表示。
Related Topics
树
深度优先搜索
二叉树
思路1:深度优先遍历(递归)
分析:一个节点直径长度有2种方式
- 左右子树的最大直径加1。
- 注意:我们统计左右子树的最大直径加1,但是当左右孩子为null时,需要返回-1,因为-1加1后等于0,叶子节点的直径就是0.
- 当左右孩子是叶子节点的时候,返回0,加1后就等于1.和叶子节点直径距离是1.
- 注意为空和叶子节点的返回值不同。
- 左子树的最大直径加1,再加上 右子树的最大直径加1。
找出整棵树的最大值。
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
int[] result = dfs(root);
return Math.max(result[0],result[1]);
}
//result[0] 表示当前节点到叶子的最大直径
//result[1]表示这棵树中最大直径
public int[] dfs(TreeNode root){
int[] result = new int[2];
if(root == null){
result[0] = result[1] = -1;
return result;
}
if(root.left ==null && root.right == null){
return result;
}
int[] left = dfs(root.left);
int[] right = dfs(root.right);
result[0] = Math.max(left[0],right[0])+1;
result[1] = Math.max(left[0]+right[0]+2,Math.max(left[1],right[1]));
return result;
}
}解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:40.9 MB,击败了41.45% 的Java用户
改进:定义一个全局变量max,函数就不需要当前节点最大值了。
class Solution {
private int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return max;
}
public int dfs(TreeNode root){
if(root == null){
return -1;
}
if(root.left ==null && root.right == null){
return 0;
}
int left = dfs(root.left);
int right = dfs(root.right);
max = Math.max(left+right+2,max);
return Math.max(left,right)+1;
}
}
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。