1 前言
定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1
2 实现
2.1 分析
- 如果此时我们知道左子树的高度,然后知道右子树的高度后,此时我们到了根节点,我们是不是可以判断左子树高度与右子树的高度差,来判断是否是平衡二叉树呢?(以上遍历方式我们可以看出,是左右中,是后序遍历。)
- 假如说,我们在遍历左子树的时候发现,左子树已经不平衡了,那么右子树是不是就不用判断了呢?直接返回就可以,该树肯定是不平衡的。因此我们需要一个标记位。
综上,我们需要进行后序遍历,然后需要一个标记位。
2.2 代码
package cn.msf.tree;
import static cn.msf.tree.MaxDepth.getMaxDepth;
import static cn.msf.tree.MinDepth.getMinDepth;
/**
* @author : msf
* @date : 2022/12/9
* 判断一颗树是否是平衡二叉树,每个节点的左右两个子树的高度差绝对值不能超过1
*/
public class IsBalanced {
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
TreeNode node3 = new TreeNode(4);
TreeNode node4 = new TreeNode(5);
TreeNode node5 = new TreeNode(6);
TreeNode node6 = new TreeNode(7);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
boolean balanced = new IsBalanced().isBalanced(root);
System.out.println("该树是否是平衡树呢?" + balanced);
}
boolean isBalanced=true;
public boolean isBalanced(TreeNode root) {
getHeight(root);
return isBalanced;
}
public int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
// 剪枝
if (!isBalanced) {
return -1;
}
// 左
int leftHeight = getHeight(root.left);
// 右
int rightHeight = getHeight(root.right);
// 中--如果不成立 标记位为false
if(Math.abs(rightHeight - leftHeight) > 1) {
isBalanced = false;
}
// 中--如果成立,则继续计算 树的高度。
return 1 + Math.max(leftHeight,rightHeight);
}
}