大致的思路分为以下几个步骤:
先找到
根节点
对应的
左子树
和
右子树
的深度,然后进行比较,如深度相差大于
1
则返回
false
即可。如深度相差小于等于
1
则执行后续的步骤
再将
根节点的左孩子
视为
根节点1
,再对比
根节点1
的左子树和右子树的深度。
再将
根节点的右孩子
视为
根节点2
,再对比
根节点2
的左子树和右子树的深度。
直到整棵树(包括子树)的高度差都不大于
1
,这棵树则为
平衡二叉树
。反之,这棵树不为
平衡二叉树
上面说的这种思想,其实是一种
自顶向下
的方法。就是从根节点出发,保证整棵树和所有的子树都能满足
高度差不大于1
。
此处以示例1中的树作为例子
比较根节点的左右子树高度差
此时,深度差不大于1,则继续向下选择左右子树。
选择节点
9
作为根节点
9
为叶子节点,无左右孩子,故跳过
选择节点
20
作为根节点
深度差不大于1,继续向下
分别选择节点
15
和
7
作为根节点
15
和
7
都为叶子节点,无左右孩子。
至此已将整棵树遍历完成,未出现深度差大于
1
的情况,故这棵树为
平衡二叉树
实现代码与思路中保持一致
public
boolean
isBalanced
(TreeNode root)
{
if
(root !=
null
){
if
(Math.abs(getDeepLen(root.left,
0
) - getDeepLen(root.right,
0
)) >
1
){
return
false
;
}
else
{
return
isBalanced(root.left) && isBalanced(root.right);
}
else
{
return
true
;
* 获取树的深度
private
int
getDeepLen
(TreeNode root,
int
len)
{
if
(root ==
null
)
return
len;
len++;
return
Math.max(getDeepLen(root.left, len), getDeepLen(root.right, len));
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(3,
new TreeNode(9),
new TreeNode(20, new TreeNode(15), new TreeNode(7)));
boolean flag = new Number110().isBalanced(treeNode);
System.out.println(flag);
虽然 自顶向下
的模式很容易被理解,但是会有很多重复计算的过程。所以不妨使用 自底向上
的模式来实现这一题,只要子树不满足条件,则这棵树一定不为 平衡二叉树
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~