文章目录
前言
平衡二叉树一般是一个有序的左右平衡的树,它具有二叉树的所有性质。
但是由于平衡二叉树必须保证其平衡的性质,所有的子树在进行添加、删除操作都要保证左右平衡,上下高度不得大于1
在这里,我们只需要考虑其是否平衡,不需要考虑其他问题
上代码
@Getter
@Setter
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
final static String LEFT = "LEFT";
final static String RIGHT = "RIGHT";
public static boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (root.left == null && root.right == null) {
return true;
}
// 计算得到左子树的深度
int leftDepth = treeDepth(root.left);
System.out.println(leftDepth);
// 计算得到右子树的深度
int rightDepth = treeDepth(root.right);
System.out.println(rightDepth);
// 如果高度差大于1,不满足平衡二叉的条件
if (Math.abs(leftDepth - rightDepth) > 1) {
return false;
}
// 判断左子树和右子树是否满足平衡二叉树的条件
return isBalanced(root.left) && isBalanced(root.right);
}
private static int treeDepth(TreeNode root) {
if (root == null) {
return 0;
}
//注意这里,必须要计算左右两个子树。因为root为当前树,可能存在左右两个节点。切勿不可只算一个方向导致偏差
// 计算左子树的深度
int left = treeDepth(root.left);
// 计算右子树的深度
int right = treeDepth(root.right);
// 树root的深度=路径最长的子树深度 + 1
return left >= right ? (left + 1) : (right + 1);
}
@Test
void test1() {
TreeNode treeNode = new TreeNode(3);
TreeNode left = new TreeNode(2);
TreeNode treeNode1 = new TreeNode(1);
TreeNode treeNode0 = new TreeNode(0);
treeNode1.setLeft(treeNode0);
left.setLeft(treeNode1);
treeNode.setLeft(left);
treeNode.setRight(left);
boolean balanced = isBalanced(treeNode);
System.out.println(balanced);
}
有啥问题欢迎评论。欢迎私信。