今天的博客是在上一篇博客的基础上进行的延伸。上一篇博客我们主要聊了二叉排序树,详情请戳《二叉排序树的查找、插入与删除》。本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,AVL是发明平衡二叉树的两个科学家的名字的缩写,在此就不做深究了。其实平衡二叉树就是二叉排序树的一种,比二叉排序树多了一个平衡的条件。在一个平衡二叉树中,一个结点的左右子树的深度差不超过1

本篇博客我们就依照平衡二叉树的特点,在创建二叉排序树的同时要保证结点的左右子树的深度差不超过1的规则。当我们往二叉排序树中插入结点时,我们要对二叉排序树的平衡性进行检查,如果因插入这个新的结点二叉排序树的平衡性被打破了,我们就得根据打破平衡二叉树的类型对二叉排序树进行调整使其再次进入到平衡二叉树的状态。当然,在删除结点时也要二叉树的平衡进行检查,发现不平衡时立马进行纠正。今天博客介绍的就是平衡二叉树的创建于结点的删除。废话少说,进入今天博客的主题。

 

一、平衡二叉树的结点

在博客的第一部分呢,我想先给出平衡二叉树的结点结构。当然是在上篇博客中的二叉排序树的结点上进行修改的。下方这个AVLTreeNote就是我们本篇平衡二叉树所使用的结点类。该类与二叉排序树的结点类差不多,就是增加了额外的三个字段。

  • depth字段用来记录以该结点为根结点的树的深度,因为下方求平衡因子时会使用到该字段。
  • balanceFactor字段就是我们所说的平衡因子,其实就是左子树的深度减去右子树的深度,因为一棵平衡二叉树的左右子树的深度差不会超过1,所以一颗平衡二叉树的节点的平衡因子为-1,0,或者1。如果为其他值,那么说明该平衡二叉树已不再平衡,需要被平衡。
  • fatherNote字段用来指向该结点父节点,我们在调整二叉树的平衡时会用到该指针。

上面就是我们添加的三个字段,下方我们会分别给出depthbalanceFactor字段的计算方式。

网友评论