代码已经同步到 仓库地址:https://github.com/Damaer/CodeSolution 文档地址:https://damaer.github.io/CodeSolution/ 图片都是
draw.io
,绘制,在/drawio
文件夹下。
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树 平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
示例1
输入
{1,2,3,4,5,6,7}
返回值
true
思路以及解答
这道题沿用了上一道【树的深度】的思路,何为平衡二叉树,也就是树的左右两个子树的深度相差不超过1,而且同时左右子树也要是平衡二叉树。譬如下面这个就是二叉树:
而这个不是平衡二叉树,节点3的左子树深度为2,右子树深度为0,两个子树的深度相差2。而如果单纯从根节点1
开始,看左右子树的深度的话,就会发现节点1左右两个子树的深度相差1,是符合平衡二叉树的原则的。这也是为什么我们除了判断根节点的左右子树高度差绝对值相差1,还需要分别判断左右两个子树是否也符合平衡二叉树的判定规则。
既然要判断整棵树,也要分别判断两个子树,那么想到的肯定就是递归。判断流程大致如下:
-
- 判断根节点是否为
null
,为null
直接返回true
。
- 判断根节点是否为
-
- 根节点如果不为
null
,需要求出左子树的高度以及右子树的高度,如果两个相差大于1,则返回·
false`。
- 根节点如果不为
-
- 如果两个子树的深度相差小于等于1,就需要分别判断左,右子树是否为平衡树。也就是以左右两个子节点为根节点,从第1步开始执行。
PS:判断树的深度的分析在上一篇中,有兴趣自己了解一下,也是使用递归,貌似图片东西多了就有点模糊,我的图片都是使用开源软件draw.io
来画的,我会将源文件都开源在github中,画得丑见谅,后续有时间再完善了。
代码如下:
代码语言:javascript复制/**
* @author wenhaoxu
* @date 2021/1/29 14:48
*/
public class Solution39 {
// 测试代码
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(1);
treeNode.left = new TreeNode(2);
treeNode.right = new TreeNode(3);
treeNode.left.left =new TreeNode(4);
treeNode.left.right = new TreeNode(5);
treeNode.right.left = new TreeNode(6);
treeNode.right.right = new TreeNode(7);
Solution39 solution39 = new Solution39();
boolean result = solution39.IsBalanced_Solution(treeNode);
System.out.println(result);
}
public boolean IsBalanced_Solution(TreeNode root) {
if (root != null) {
int left = deep(root.left);
int right = deep(root.right);
if (Math.abs(left - right) > 1) {
return false;
} else {
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
}
}
return true;
}
// 求树的深度
public int deep(TreeNode node) {
if (node == null) {
return 0;
}
return Math.max(deep(node.left), deep(node.right)) 1;
}
}
class TreeNode {
int val;
public TreeNode left;
public TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
【作者简介】:秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~ - END -