数据结构之AVL树

一、二叉查找树

二叉搜索树(BST):又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和卫星数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NIL的结点,而叶子结点的孩子结点指针也为NIL(百度百科)

卫星数据:除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关


二叉查找树的性质:设x是二叉查找树中的一个结点。如果y是x左子树中的一个结点,那么y.key≤x.key。如果y是x右子树中的一个结点,那么y.key≥x.key,在二叉查找树中:

  1. 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
  2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
  3. 任意结点的左、右子树也分别为二叉查找树。

二、平衡二叉树(AVL Tree)

平衡二叉树(AVL Tree):平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1;查找的时间复杂度 O(Log2n)

LL(LeftLeft):插入或删除一个节点后,根节点的左孩子(Left Child)的左孩子(Left Child)还有非空节点,导致根节点的左子树高度比右子树高度大2,AVL树失去平衡
恢复平衡的步骤

  1. 将根节点的左孩子作为新根节点。
  2. 将新根节点的右孩子作为原根节点的左孩子。
  3. 将原根节点作为新根节点的右孩子。
     

RR(RightRight):插入或删除一个节点后,根节点的右孩子(Right Child)的右孩子(Right Child)还有非空节点,导致根节点的右子树高度比左子树高度高2,AVL树失去平衡。
恢复平衡的步骤:

  1. 将根节点的右孩子作为新根节点
  2. 将新根节点的左孩子作为原根节点的右孩子
  3. 将原根节点作为新根节点的左孩子

LR(LeftRight):插入或删除一个节点后,根节点的左孩子(Left Child)的右孩子(Right Child)还有非空节点,导致根节点的左子树高度比右子树高度高2,AVL树失去平衡
恢复平衡的步骤:

  1. 围绕根节点的左孩子进行RR旋转。
  2. 围绕根节点进行LL旋转。

RL(RightLeft):插入或删除一个节点后,根节点的右孩子(Right Child)的左孩子(Left Child)还有非空节点,导致根节点的右子树高度比左子树高度高2,AVL树失去平衡
恢复平衡的步骤:

  1. 围绕根节点的右孩子进行LL旋转。
  2. 围绕根节点进行RR旋转。

三、红黑树 (Red-Black Tree)

红黑树:是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或BlACK;通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2 倍,因而是近似于平衡的。树中每个结点包含5个属性:color、key、left 、right 和 parent;如果一个结点没有子结点或父结点,则该结点相应指针属性的值为Nil;我们可以把这些Nil视为指向二又查找树的叶结点(外部结点)的指针,而把带关键字的结点视为树的内部结点。

红黑树是满足以下红黑性质的二叉搜索树: 

  1. 每个结点或是红色的,或是黑色的。 
  2. 根结点是黑色的。 
  3. 每个叶结点Nil一定是黑色的。
  4. 如果一个结点是红色的,则它的两个子结点都是黑色的。 
  5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点

红黑树与平衡二叉树、二叉查找树:

  • AVL树是严格的平衡二叉树,平衡条件必须满足(所有结点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保存平衡,而因为旋转非常耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。
  • 红黑树是弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,插入最多两次旋转,删除最多三次旋转,所以对于搜索,插入,删除操作较多的情况下
  • AVL树与read-black Tree 他们的查找性能都优秀与二叉查找树(由于不平衡,高度难以控制);AVL追求绝对的平衡所以他的高度相比read-black Tree要低,对于查找AVL树更快
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值