验证平衡二叉树

package class07;

/**
 * 验证平衡二叉树
 */
//测试链接:https://leetcode.com/problems/balanced-binary-tree
public class Code02_BalancedBinaryTree {
    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    /**
     * 定义一个类Info,包含两个信息。
     * 1.以当前节点为根节点的树,是否是平衡树。
     * 2.以当前节点为根节点的树,的高度是多少(算上根节点自己)。
     */
    public static class Info {
        boolean isBalanced;
        int height;

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

    /**
     * 给出二叉树的根节点root。返回这个二叉树是否是平衡二叉树。
     *
     * @param root 根节点
     * @return 是否是平衡二叉树
     */
    public static boolean isBalanced(TreeNode root) {
        return process(root).isBalanced;
    }

    private static Info process(TreeNode root) {
        if (root == null) {//如果是空节点,则返回是平衡二叉树,高度是0。
            return new Info(true, 0);
        }
        //root != null
        Info leftInfo = process(root.left);//求出当前节点的左子树,是否是平衡二叉树,高度是多少。
        Info rightInfo = process(root.right);//求出当前节点的右子树,是否是平衡二叉树,高度是多少。
        int height = Math.max(leftInfo.height, rightInfo.height) + 1;//当前二叉树的高度是,左子树和右子树较高的树的高度,再加1。
        //只有当左子树平衡,并且右子树平衡,并且左子树和右子树的高度差小于等于1的时候,以当前节点为根节点的二叉树才是平衡二叉树。
        boolean isBalanced = leftInfo.isBalanced && rightInfo.isBalanced && (Math.abs(leftInfo.height - rightInfo.height) <= 1);
        //返回是否是平衡二叉树,高度是多少。
        //递归的注意事项:
        //递归就是要对每一个节点一视同仁。虽然最后只要isBalanced,但是每一次process(),都要向上返回高度height。
        //否则即使左子树和右子树都是平衡二叉树,但是两者的高度差,大于1,此时的结果还是非平衡二叉树。
        return new Info(isBalanced, height);
    }
}

 

posted @ 2022-08-12 22:36  TheFloorIsNotTooHot  阅读(19)  评论(0)    收藏  举报