思路:
用递归的思想。
一棵树经过根节点的最大直径=其左子树的最大深度(递归)+ 右子树的最大深度(递归)。
这里可能会不理解:
一棵树经过根节点的最大直径其实等于左子树的最深路径+右子树的最深路径+根节点到左右子结点的路径。
一棵树的深度是指从根节点到最深的叶子结点经过的节点数。但是这条路径的长度等于深度-1。
比如 1—>2—>3—>4。这条路径经过的节点数为4,但路径长度为4-1=3。
所以左子树的最大深度-1等于左子树的最深路径,右子树的最大深度-1等于右子树的最深路径。
当左右子树都存在时,一棵树经过根节点的最大直径=左子树的最大深度-1+右子树的最大深度-1+2 = 左子树的最大深度+右子树的最大深度。
当左右子树只有一个存在时,一棵树经过根节点的最大直径 = 左/右子树的最大深度-1 + 1 = 左/右子树的最大深度。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int Max = 0;//全局变量,记录当前的最大直径
public int maxRoute(TreeNode root)//该函数用来找出当前树经过根节点的最大直径,返回当前树的最大深度
{
if(root==null)//根节点为空,深度为0
return 0;
if(root.left==null&&root.right==null)//根节点的左右子树为空,深度为1
return 1;
int L = maxRoute(root.left);//递归遍历左子树的最大深度
int R = maxRoute(root.right);//递归遍历右子树的最大深度
int max = L+R;//经过根节点的最大直径
if(max>Max) Max = max;
return 1 + Math.max(L,R);
}
public int diameterOfBinaryTree(TreeNode root) {
maxRoute(root);
return Max;
}
}