定义
二叉搜索树在一定程度上可以提高搜索效率,但是当有序序列为{1,2,3,4,5,6}时,此时构造的二叉搜索树为右斜树。可以发现二叉树已经退化为了单链表,搜索效率降低为O(n)
在此二叉搜索树中查找元素6需要查找6次,二叉搜索树的查找效率取决于树的高度,因此树的高度越低,其查询效率就会越高。同样的序列,更改储存方式,查找元素6时只需要比较3次,查询效率提高一倍。
可以看出当节点数目一定,保持数的左右两端平衡,树的查找效率最高,这种左右子树的高度相差不超过1的树为平衡二叉树。
平衡因子
定义:某节点的左子树与右子树的高度(深度)差即为该节点的平衡因子,平衡二叉树中不存在平衡因子大于1的节点。在一棵平衡二叉树中,节点的平衡因子只能取-1,1或者0
左旋与右旋
左旋
如图所示的平衡二叉树
如在此平衡二叉树插入节点62,树结构变为:
可以得出40节点的左子树高度为1,右子树高度为3,此时平衡因子为-2,树失去平衡。为保证树的平衡,此时需要对节点40做出旋转,因为右子树高度高于左子树,对节点进行左旋操作,流程如下:
(1)原根节点的右孩子替代此节点位置。
(2)原根节点的右孩子的左子树变为原根节点的右子树。
(3)原根节点本身变为右孩子的左子树。
左旋过程:
右旋
右旋过程:
右旋操作与左旋类似,操作流程为:
(1)原根节点的左孩子代表此节点
(2)原根节点的左孩子的右子树变为节点的左子树。
(3)原根节点作为左孩子节点的右子树。
过程如下:
插入:
假设一棵AVL树的某节点为A,有时会使A的左右子树高度差大于1,从而破坏了原有AVL树的平衡。平衡二叉树插入节点的情况分为以下2种:
A的左孩子的左子树插入节点
假设现在有这样的一颗平衡二叉树:
节点A的左孩子为B,B的左子树为D,无论在节点D的左子树或者右子树中插入F均会导致节点A失衡。因此需要对节点A进行旋转操作。A的平衡因子为2,值为正,因此对A进行右旋操作。
过程如下:
A的右孩子的右子树插入节点
插入节点F后,节点A的平衡因子为-2,对节点A进行左旋操作。
过程如下:
删除
平衡二叉树的删除情况与二叉搜索树删除情况相同,同样分为以下四种情况:
(1)删除叶子节点
(2)删除节点只有左子树
(3)删除节点只有右子树
(4)删除节点既有左子树又有右子树
平衡二叉树的节点删除与二叉搜索树删除方法一致,但是需要在节点删除后判断树是否仍然保持平衡,若出现失衡情况,需要进行调整。