二叉排序的操作平均性,和树的高度有关,最差退化成链表,
所以关于二叉排序树的研究就是怎么能平衡树的高度。
红黑树就是一种,工程上可实现。
不过定义有点复杂,要遵循5条原则:
1 节点只有红黑两种颜色
2 根节点是黑色的
3 叶子节点是黑色的
4 红色节点的左右儿子节点必须是黑色的
5 从任意节点触发,不包括该节点,到叶子节点过程中的黑色节点个数一样,也成为黑高度。
规矩多了些,尤其4,5要求黑高,先记着。
有了二叉排序树的基础,本文先实现左右旋转,不讲着色。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef enum enColor
{
RED,
BLACK
}Color;
typedef struct stRBNode
{
int key;
struct stRBNode* pP;
struct stRBNode* pL;
struct stRBNode* pR;
Color color;
}RBNode;
RBNode Nil = { 0,NULL,NULL,NULL,BLACK };
RBNode* pNil = &Nil;
RBNode* rb_new_node(int key)
{
RBNode* pNewNode = (RBNode*)malloc(sizeof(RBNode));
if (pNewNode == NULL) return pNil;
pNewNode->key = key;
pNewNode->pL = pNil;
pNewNode->pR = pNil;
pNewNode->pP = pNil;
pNew