题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
解题思路
首先我们要了解平衡二叉树是什么?平衡二叉树是空树或者树的左右子树的高度之差不大于1,已经左右子树都为平衡树,这个树才能称之为平衡二叉树。
上图中,只有右边的树才能是平衡二叉树。因为左边的树的节点2与节点7的高度之差为2,所以不是平衡二叉树。
容易出错的点
我把平衡二叉树的概念搞错了,我把节点的左右子树的高度之差理解为了左右子树节点总数之差。
要注意平时对数据结构概念的理解!!!
代码的实现
我使用的是递归的方法。新建立一个函数
- 判断当前节点是否为空,如果为空,返回0
- 如果不为空,递归获取左右子树的高度
- 判断左右子树高度是否有-1,如果为-1则表示子树不是平衡二叉树,需要结束递归返回-1
- 如果左右子树都是平衡二叉树,获取得到的是子树的高度,判断左右子树的高度之差是否大于1,如果大于1,则返回-1
- 如果不大于1,将左右子树高度取较大的值+1返回。
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
// 平衡二叉树左右子节点的数目之差不大于1,则表式为平衡二叉树,并且每个分支都是平衡二叉树
return balanceNode(root) != -1;
}
// 如果是平衡二叉树,则返回二叉树的节点数,如果不是平衡二叉树,则返回-1
public int balanceNode(TreeNode root){
if(root == null) return 0;
int left=0, right=0;
left = balanceNode(root.left);
right = balanceNode(root.right);
if(left == -1 || right == -1){
return -1;
}
int res = Math.abs(left - right);
if(res > 1) return -1;
else return Math.max(left, right) + 1;
}
}