题目描述
解题思路
代码如下
public boolean IsBalanced_Solution(TreeNode root) { return getDepth(root) != -1; } private int getDepth(TreeNode root) { if (root == null) return 0; int left = getDepth(root.left); if (left == -1) return -1; int right = getDepth(root.right); if (right == -1) return -1; return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right); }
平衡二叉树简介
定义
平衡二叉树也叫自平衡二叉搜索树(Self-Balancing Binary Search Tree),所以其本质也是一颗二叉搜索树,不过为了限制左右子树的高度差,避免出现倾斜树等偏向于线性结构演化的情况,所以对二叉搜索树中每个节点的左右子树作了限制,左右子树的高度差称之为平衡因子,树中每个节点的平衡因子绝对值不大于 ,此时二叉搜索树称之为平衡二叉树。
自平衡是指,在对平衡二叉树执行插入或删除节点操作后,可能会导致树中某个节点的平衡因子绝对值超过 ,即平衡二叉树变得“不平衡”,为了恢复该节点左右子树的平衡,此时需要对节点执行旋转操作。
情景分析
在执行插入或删除节点操作后,平衡因子绝对值变为大于 的情况,即左右子树的高度差为
或
的情况,可以归纳为如下四种:
- 左左情况(LL)
情况是指根节点的平衡因子为
,根节点的左子节点平衡因子为
或
。
![](http://upload-images.jianshu.io/upload_images/9738807-7887d5d201f0e9b3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/324/format/webp)
如图 LL_1 所示,当节点 的子节点被删除,或者节点
插入子节点
时,根节点
的平衡因子变为
,
的左子节点
的平衡因子为
。
![](http://upload-images.jianshu.io/upload_images/9738807-ddc2fd5055daafbd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/317/format/webp)
或者如图 LL_2 所示,当节点 的子节点被删除,根节点
的平衡因子变为
,
的左子节点
的平衡因子为
。
当根节点的左子树高度比右子树的高度大
,因为平衡二叉树是一种有序结构,节点值之间具有大小关系,所以如果根节点保持不变,左右子树始终分隔两岸,则无论如何调整节点位置,二叉树始终不可能恢复平衡。所以需要更换根节点,使得新的根节点的左右子树的高度趋于平衡。
该情况下需要对平衡二叉树执行右旋操作:
- 设置根节点
的左子节点为新的根节点
;
- 将
节点的右子树作为
节点的左子树,将
节点作为
的右子树,即降低“左子树”高度,提升“右子树”高度,使得新的左右子树高度趋于平衡;
对于图 LL_1,节点 的平衡因子为
,设
节点的左子树
高度为
,则右子树
高度为
,因为
的平衡因子为
,所以二叉树
的高度为:
。则右旋操作后,
的左子树高度不变为
,右子树高度为:
,此时二叉树为平衡二叉树,如下图 balanced_LL_1。
![](http://upload-images.jianshu.io/upload_images/9738807-2d3a1dd4b02ffed1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/319/format/webp)
对于图 LL_2,节点 的平衡因子为
,设
节点的左右子树高度为
,则二叉树
的高度为:
。右旋操作后,
的左子树高度不变为
,右子树高度为:
,此时二叉树为平衡二叉树,如下图 balanced_LL_2。
![](http://upload-images.jianshu.io/upload_images/9738807-ea0f758bc870e4f3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/394/format/webp)
- 右右情况(RR)
该情况与上面的左左情况具有对称性,对平衡二叉树执行插入或删除节点操作后,根节点的平衡因子变为 ,根节点的右子节点平衡因子为
或
,为了恢复二叉树的平衡,需要进行左旋,来使得新的左右子树高度区域平衡。
![](http://upload-images.jianshu.io/upload_images/9738807-6e8e244576192a9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/286/format/webp)
如上图 所示,该情况下需要对平衡二叉树执行左旋操作:
- 设置根节点
的右子节点为新的根节点
;
- 将
节点的左子树作为
节点的右子树,将
节点作为
的左子树,即降低“右子树”高度,提升“左子树”高度,使得新的左右子树高度趋于平衡;
左旋操作后,平衡二叉树如图 balanced_RR 所示。
![](http://upload-images.jianshu.io/upload_images/9738807-3f7d44a6c19fb826.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/277/format/webp)