红黑树(Red Black Tree)

 

[背景]
每个结点要么是“红色”,要么是“黑色”(后面将说明)
所有的叶结点都是空结点,并且是“黑色”的
如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的。
结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点
根结点永远是“黑色”的


[调整算法核心]:

1)调整前提:一个新加入节点不等于root,它的老爸是红人
            一个新建立的节点,一开始是红人,(人之初,性本善?)
            这种类型的树,暗含右儿子比左儿子权重大,右儿子存放得值应该有大于左儿子的值的逻辑关系
            一个老子最多俩儿子,每个儿子最多一个老子,
            如果儿子的老子不幸成了别人的爹,必须给它一个新爹,才能保证树的健康,和谐
                       
2)节点的插入是比较简单的,比较一下待插入点和存在节点的大小,小于往存在节点左插,大于往存在节点右插
           
3)比较繁琐一点的是插入以后,删除以后树的调整:
  Tree_Rotate_Left Tree_Rotate_Right 基本上都长成这个模样

  Tree_Rotate_Left(root,node) //root表示根节点,node是以root为根的树的一个节点
 
  它的实现的功能就是: node要变成它右儿子的左儿子
  (I)node变成它的原右儿子的新左儿子,
    <同时意味着node要失去那它的原右儿子:(,node原右儿子的左儿子也没有爹那>
 
  (II)将node原右儿子的左儿子调整node的新右儿子
    <因为在(I)中,有人没有那儿子,有人没有那爹,就把他俩给重新组合成父子吧,看起来还是挺好的搭配,
    但是这样好像有点"乱">
 
  (III)node原右儿子取代node原来在树中的位置,


  Tree_Rotate_Right(root,node)
  实现的功能应该是: node要变成它左儿子的右儿子
  (I)node变成它的原左儿子的右儿子
  (II)node原左儿子的右儿子调整node的左儿子
  (III)node原左儿子取代node原来在树中的位置,
                     
  调整的时候,应该遵循一个原则,调整中选择的创建的新的父子关系,使得相邻节点之间的平衡度,也就是差值就比较小
 
                       
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值