不得不说《算法导论》是一本非常厉害的书!我主要参考了《算法导论》和网络上其他一些优秀的红黑书原理的资料,实现了这个红黑树的代码。很有意义,在整个过程中虽然大部分的时间还是看着书上的伪代码在敲c,但是整个原理已经大致在心中有了一个轮廓,为什么要这么实现红黑树那?前人是怎么想出来的那?路漫漫其修远兮,吾将上下而求索!希望自己有一天也能设计出这么精妙的数据结构算法。这篇文章之后我还将会实现一下avl树,这个树我一直耿耿于怀!先附上一些代码,再说说自己最深的感触。
/*************************************************************************
> File Name: rb_tree.c
> Author: jeff zhu
> Mail: 908190355@qq.com
> Created Time: 2016年08月30日 星期二 22时08分53秒
************************************************************************/
#include <stdio.h>
#include <limits.h>
#include <malloc.h>
#define RED 1
#define BLACK 2
#define NIL INT_MIN
typedef int EleType;
typedef struct rb_tree_node {
struct rb_tree_node *parent;
struct rb_tree_node *left;
struct rb_tree_node *right;
EleType key;
int color;
}NODE;
typedef struct rb_tree {
NODE *root;
NODE *nil;
}RBTREE;
void init_rb_tree_root (RBTREE *T) ;
NODE *create_rb_tree_node (RBTREE T , EleType key) ;
void rb_tree_insert (RBTREE *T , NODE *x) ;
void rotate_right (RBTREE *T , NODE *y) ;
void rotate_left (RBTREE *T , NODE *x) ;
void rb_tree_insert_fixup (RBTREE *T , NODE *x) ;
void travel_tree (RBTREE *T , NODE *node) ;
NODE* minimum_rb_tree (RBTREE *T , NODE *x) ;
void rb_tree_delete_fixup (RBTREE *T , NODE *x) ;
void rb_tree_delete (RBTREE *T , NODE *z) ;
int main () {
RBTREE T;
init_rb_tree_root (&T);
NODE *temp;
int flag;
while (scanf ("%d" , &flag) , flag != -1) {
NODE *temp = create_rb_tree_node (T , flag);
rb_tree_insert (&T , temp);
}
rb_tree_delete (&T , T.root);
travel_tree (&T , T.root);
}
void init_rb_tree_root (RBTREE *T) {
T->root = NULL;
T->nil = (NODE *) malloc (sizeof (NODE));
T->nil->parent = NULL;
T->nil->left = NULL;
T->nil->right = NULL;
T->nil->key = NIL;
T->nil->color = BLACK;
}
NODE *create_rb_tree_node (RBTREE T , EleType key) {
// create a red-black-tree and its default color is RED
NODE *te