Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
前言
力扣第110题 平衡二叉树 如下所示:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: true
示例 2:
输入: root = [1,2,2,3,3,null,null,4,4]
输出: false
一、思路
这一题还是比较简单实现的,像看到树这种数据结构很容易就能联想到使用 递归 来遍历整棵树。这样可以省去自己去在循环中自己去维护 栈 的操作。
大致的思路分为以下几个步骤:
- 先找到
根节点对应的左子树和右子树的深度,然后进行比较,如深度相差大于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);
}
结果
三、总结
虽然 自顶向下 的模式很容易被理解,但是会有很多重复计算的过程。所以不妨使用 自底向上 的模式来实现这一题,只要子树不满足条件,则这棵树一定不为 平衡二叉树
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~