
思路:DFS,每个节点求它左右两边节点的最大深度之和,然后递归求最大值,在递归的过程中需要求出每个节点的深度。
1.本题有两个关键概念:
(1)链:从node的子树的叶子节点到node节点的路径,其实就是深度。
(2)直径:就是由两条(或者一条)链拼成的路径。
2.确定参数和返回值:
(1)参数:需传入根节点root。
(2)返回值:返回当前子树的深度。
3.确定终止条件:当前节点为null时,代表空节点,空节点的链长是-1。
4.确定单层递归的逻辑:
(1)左:求左子树的深度。
(2)右:求右子树的深度。
5.注意:直径可能在root下面的某个节点拐弯,不一定会经过root。
6.复杂度分析:
(1)时间复杂度:O(n),其中n为二叉树的节点个数。
(2)空间复杂度:O(n),最坏情况下,二叉树退化成一条链,递归需要O(n)的栈空间。
附代码:
java
class Solution {
//表示最长直径
private int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null || (root.left == null && root.right == null)){
return 0;
}
//求最长直径
maxDepth(root);
return res;
}
private int maxDepth(TreeNode root){
if(root == null){
return 0;
}
//求左孩子的深度
int leftDepth = maxDepth(root.left);
//求右孩子的深度
int rightDepth = maxDepth(root.right);
//更新最长直径,最长直径就是某个节点的左孩子深度+右孩子深度
res = Math.max(res,leftDepth + rightDepth);
//返回给递归调用的上层,让上层节点知道这个子树的深度是多少
return Math.max(leftDepth,rightDepth) + 1;
}
}