[背景]
每个结点要么是“红色”,要么是“黑色”(后面将说明)
所有的叶结点都是空结点,并且是“黑色”的
如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的。
结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点
根结点永远是“黑色”的
[调整算法核心]:
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原来在树中的位置,
调整的时候,应该遵循一个原则,调整中选择的创建的新的父子关系,使得相邻节点之间的平衡度,也就是差值就比较小