import java.util.*;

public class Solution {
    public int diameterOfBinaryTree (TreeNode root) {
        // 预处理
        if (root == null) return 0;
        // 获取左子树的最大深度
        int leftDepth = getMaxDepth(root.left);
        // 获取右子树的最大深度
        int rightDepth = getMaxDepth(root.right);

        // 情况1:直径路径过根结点
        int max1 = (leftDepth + 1 + rightDepth) - 1; // 路径长度 = 结点个数 - 1
        // 情况2:直径路径在左子树中
        int max2 = diameterOfBinaryTree(root.left);
        // 情况3:直径路径在右子树中
        int max3 = diameterOfBinaryTree(root.right);

        // 返回三种情况中的最大值
        int[] temp = {max1, max2, max3};
        Arrays.sort(temp);
        return temp[temp.length-1];
    }

    // 获取当前树的最大深度
    public static int getMaxDepth(TreeNode root) {
        // 预处理
        if (root == null) return 0;
        // 递归求左右子树的最大深度
        return Math.max(getMaxDepth(root.left),getMaxDepth(root.right)) + 1;
    }
}