import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public class Info {
        public boolean isBalanced;
        public int maxDepth;

        public Info () {
            this.isBalanced = true;
            this.maxDepth = 0;
        }

        public Info (boolean isBalanced, int maxDepth) {
            this.isBalanced = isBalanced;
            this.maxDepth = maxDepth;
        }
    }

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return bool布尔型
     */
    public boolean IsBalanced_Solution (TreeNode pRoot) {
        // write code here

        // 1.我要干什么:
        //        获知【左子树】中【是否平衡,最大深度多少】
        //        获知【右子树】中【是否平衡,最大深度多少】

        // 2.我需要什么信息:
        //      综上所述,我需要左右子树的【是否平衡,最大深度多少】

        // 3.我如何利用两个子树的信息加工出来我的信息:
        //      若左右两个子树都平衡,且最大深度相差<=1,则本子树平衡

        // 调用递归函数求解
        return process(pRoot).isBalanced;
    }

    public Info process(TreeNode root) {
        // 递归出口
        if (root == null) {
            return new Info();
        }

        // 从左右子树获取信息
        Info leftInfo = process(root.left);
        Info rightInfo = process(root.right);

        // 根据获取到的信息加工出自己的信息
        boolean isBalanced = leftInfo.isBalanced &&
                             rightInfo.isBalanced &&
                             (Math.abs(leftInfo.maxDepth - rightInfo.maxDepth) <= 1);
        int maxDepth = Math.max(leftInfo.maxDepth, rightInfo.maxDepth) + 1;
        return new Info(isBalanced, maxDepth);
    }
}