平衡二叉树为什么这样去写会报错?

我的想法是如果在递归遍历过程的时候发现一边子树已经为Null,而另一边的子树却还有两个·节点的时候返回false,但是不知道为什么·这样去写会报错?不太清楚自己是哪里想的很明白:

img

img


```java
  public boolean isBalanced(TreeNode root) {
        if(root==null)
        return true;
        if(root.right!=null){
             if(root.left==null&&root.right.right!=null){
            return false;
        }
        }
        if(root.left!=null){
             if(root.right==null&&root.left.left!=null){
            return false;
        }
        }       
        return isBalanced(root.right)&&isBalanced(root.left);
    }

```

如果左子树的高度不为0,右子树的高度比左子树大2也不是平衡二叉树

【以下回答由 GPT 生成】

问题在于你在检查右子树的平衡性时,只判断了右子树的右孩子是否为空,而没有判断右子树的左孩子是否为空。同样在检查左子树的平衡性时,只判断了左子树的左孩子是否为空,而没有判断左子树的右孩子是否为空。

这导致当右子树的左孩子为空,右子树的右孩子不为空,且左子树的右孩子为空,左子树的左孩子不为空时,你的代码会判断出该二叉树为平衡二叉树,而实际上它不是。

以下是修改后的代码:

public boolean isBalanced(TreeNode root) {
  if (root == null) {
    return true;
  }

  int leftHeight = getHeight(root.left); // 获取左子树的高度
  int rightHeight = getHeight(root.right); // 获取右子树的高度

  // 判断当前节点是否满足平衡条件
  if (Math.abs(leftHeight - rightHeight) > 1) {
    return false;
  }

  // 校验左子树和右子树的平衡性
  return isBalanced(root.left) && isBalanced(root.right);
}

// 获取二叉树的高度
private int getHeight(TreeNode node) {
  if (node == null) {
    return 0;
  }

  int leftHeight = getHeight(node.left); // 获取左子树的高度
  int rightHeight = getHeight(node.right); // 获取右子树的高度

  return Math.max(leftHeight, rightHeight) + 1;
}

这样修改后,我们通过getHeight方法分别获取左子树和右子树的高度,然后再判断当前节点是否满足平衡条件。同时,在递归判断左子树和右子树的平衡性时,会继续进行判断,直到遍历到叶子节点为止。

希望以上解决方案能解决你的问题。如果有任何疑问,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^