【数据结构】树(三):红黑树插入与删除操作(C++实现)

实现源码过长,直接附链接在文章最后面,如有错误,还请不吝赐教。
由于实现的时候是先实现插入,再实现删除,而且参考的不是同一本书,导致变量设置有一些不太一样,所以两个操作demo代码是分开的,delete_demo中也包含插入操作。

基本定义及性质

  1. 红黑树是一种自平衡二叉查找树,其连接(边)被标记为红色或者黑色,节点的颜色与其上方的连接边(与父节点相连的边)的颜色相同,可以用于表示order为4的B树。典型的用途是实现关联数组,在C++ STL中,很多部分(包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。
  2. 红黑树必须遵循的性质如下:
    • 节点是红色或黑色。
    • 根节点是黑色。
    • 每个叶节点(NIL节点,空节点)是黑色的。
    • red condition: 每个红色节点的两个子节点都是黑色,同理,每个红色节点都存在父节点并且为黑色节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    • black condition: 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
      从最后两个性质可以得到一个关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长(包含n个节点的红黑树的高度不大于2lgn)。结果是这个树大致上是平衡的。
      显然,红黑树的遍历与查找操作与普通二叉树相同,而插入和删除操作需要一些额外操作来维持红黑树的性质。

插入操作

首先应当考虑的是插入的节点应当为红色还是黑色?假设为黑色,那么有一条路径上的黑色节点数目增加了,而其他路径维持原状,所以违反了black condition。因此所有插入的节点都应

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值