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);
}
}