public class BalancedBinaryTree {
    //方法一:先序遍历
    public boolean isBalanced1(TreeNode root) {
        if(root==null) return true;

        return Math.abs(height(root.left)-height(root.right))<=1
                &&isBalanced(root.left)
                &&isBalanced(root.right);
    }

    //方法二:后序遍历
    public boolean isBalanced(TreeNode root) {
        return balancedHeight(root)>-1;
    }

    //定义一个直接判断当前树是否平衡的方法,也返回高度
    public int balancedHeight(TreeNode root){
        if(root==null) return 0;
        //递归计算左右子树高度
        int leftHeight = balancedHeight(root.left);
        int rightHeight = balancedHeight(root.right);

        //如果子树不平衡,直接返回-1
        if(leftHeight==-1||rightHeight==-1||Math.abs(leftHeight-rightHeight)>1){
            return -1;
        }

        //如果平衡 返回当前高度
        return Math.max(leftHeight,rightHeight)+1;
    }

    //定义一个计算树的高度的方法
    public int height(TreeNode root){
        if(root==null) return 0;
        return Math.max(height(root.left),height(root.right))+1;
    }

    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(3);
        TreeNode node2 = new TreeNode(9);
        TreeNode node3 = new TreeNode(20);
        TreeNode node4 = new TreeNode(15);
        TreeNode node5 = new TreeNode(7);
        TreeNode node6 = new TreeNode(17);

        node1.left = node2;
        node1.right = node3;
        node3.left=node4;
        node3.right=node5;
//        node5.right = node6;

        BalancedBinaryTree balancedBinaryTree = new BalancedBinaryTree();
        System.out.println(balancedBinaryTree.isBalanced(node1));
    }
}