数据结构-平衡二叉查找树和红黑树

 

平衡二叉查找树

平衡二叉树的严格定义:二叉树中任意节点的左右子树高度相差不能大于1。所以满二叉树和完全二叉树都是平衡二叉树,而非完全二叉树也可以是平衡二叉树

如下图:

平衡二叉查找树不仅需要满足平衡二叉树的特定,还需要满足二叉查找树的特点。最先被发明的平衡二叉查找树是AVL树AVL树严格符合上面谈到的平衡二叉查找树的定义。任意节点左右子树高度相差不大于1,是一颗高度平衡的二叉查找树。

AVL树的优缺点:

ALV树是一颗高度平衡的二叉查找树,查询效率非常高效,时间复杂度为O(log^{n})。但有利也由弊,AVL树为了维持高度的平衡,每次插入和删除数据,都需要对数据进行调整,这个就比较耗时了,对于频繁插入和删除操作的数据集合,使用AVL树的代价就点高了。

 

正确的理解平衡的概念

发明平衡二叉查找树这类数据结构的初衷,用来解决二叉查找树进行频繁插入、删除操作等动态更新的情况下,出现时间复杂度的退化问题

平衡二叉查找树中的“平衡”的意思,其实就是让整棵树看起来比较“对称”,比较平衡一些,不要出现左子树很高,右子树很低的情况,这样整棵树相对来说要低一些,相应的插入、删除、查找的效率要高一些

如果我们设计一颗新的平衡二叉查找树,只要树的高度不比log_{2}^{n}大很多,尽管不符合严格定义的平衡二叉查找树,但我们仍可以说它是一颗合格的平衡二叉查找树。

红黑树就是这样一颗不那么严格的平衡二叉查找树,它的性能高效稳定。其插入、删除、查询的时间复杂度近似O(log_{2}^{n})。所以工业级别使用的数据结构是二叉查找树时,会首选红黑树的原因。

 

红黑树

红黑树的英文名“red-black tree”,简称"R-B tree"。

红黑树中的节点,一类标记为黑色,一类标记为红色。除此之外红黑树还需要满足以下几个要有

1、根节点标记为黑色

2、每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据

3、父子节点不能同时为红色,也就是说,红色节点是被黑色节点隔开的

4、每个节点,从该节点达到其可达叶子节点的所有路径,都包含相同数目的黑色节点。

如下图:

 

为什么说红黑树近似平衡

首先,我们将红黑树中的红色节点去掉,那么红黑树就会从二叉树变为四叉树,而前面红黑树的定义中有一条:从任意节点到可达的叶子节点包含相同数目的黑色节点。所以对于相同数目的黑色节点,该四叉树的高度要小于等于完全二叉树。所以其高度要小于等于log_{2}^{n}。如下图:

红黑树中的红色节点是被黑色节点分隔开的。所有当我们把红色节点添加回去的时候,红黑树的高度不会超过2{log_{2}}^{n}。也就是说红黑树的高度近似2{log_{2}}^{n}

这样推导出来的结果并不是太准确,实际上红黑树的性能更好。

 

红黑树的实现,这个有点复杂,但其平衡步骤相对成熟稳定。以后有时间再进行研究补充。

我参考一下王争老师的总结:红黑树的平衡过程跟魔方复原非常神似,大致过程就是:遇到什么样的节点排布,我们就对应怎么去调整。只要按照这些固定的调整规则来操作,就能将一个非平衡的红黑树调整成平衡的

 

参考:数据结构与算法之美--王争

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值