红黑树插入的栈实现
来源:互联网 发布:2016年上证指数数据 编辑:程序博客网 时间:2024/04/20 01:56
可以不使用parent 指针,直接使用栈实现,方法是在插入时记下插入结点的所有祖先结点,然后回溯时再使用,以下代码使用数组简单实现栈结构。
/* ================================================================== *//* no parent rbtree *//* ================================================================== */void __rb_np_rotate_left(struct rb_node *node, struct rb_node *parent, struct rb_root *root){ struct rb_node *right = node->right; node->right = right->left; right->left = node; if (parent == NULL) { root->rb_node = right; } else { if (parent->left == node) parent->left = right; else parent->right = right; }}void __rb_np_rotate_right(struct rb_node *node, struct rb_node *parent, struct rb_root *root){ struct rb_node *left = node->left; node->left = left->right; left->right = node; if (parent == NULL) { root->rb_node = left; } else { if (parent->left == node) parent->left = left; else parent->right = left; }}/* use s[0] as NULL pointer */#define PUSH_S(s, n, i) (s)[++(i)]=(n)#define POP_S(s, i) (s)[(i)--]#define TOP_S(s, i) (s)[(i)]static void rb_np_insert_color(struct rb_node *node, struct rb_root *root, struct rb_node **s, int i){ struct rb_node *parent, *uncle, *gparent, *tmp; for (;;) { parent = POP_S(s, i); if (parent == NULL || parent->color == RB_BLACK) { break; } gparent = POP_S(s, i); if (parent == gparent->left) { uncle = gparent->right; if (uncle && uncle->color == RB_RED) { /* case 1 */ parent->color = RB_BLACK; uncle->color = RB_BLACK; gparent->color = RB_RED; node = gparent; continue; } if (parent->right == node) { /* case 2 */ __rb_np_rotate_left(parent, gparent, root); tmp = node; node = parent; parent = tmp; } /* case 3 */ tmp = TOP_S(s, i); __rb_np_rotate_right(gparent, tmp, root); parent->color = RB_BLACK; gparent->color = RB_RED; break; } else { uncle = gparent->left; if (uncle && uncle->color == RB_RED) { /* case 1 */ parent->color = RB_BLACK; uncle->color = RB_BLACK; gparent->color = RB_RED; node = gparent; continue; } if (parent->left == node) { /* case 2 */ __rb_np_rotate_right(parent, gparent, root); tmp = node; node = parent; parent = tmp; } /* case 3 */ tmp = TOP_S(s, i); __rb_np_rotate_left(gparent, tmp, root); parent->color = RB_BLACK; gparent->color = RB_RED; break; } } root->rb_node->color = RB_BLACK;} void rb_np_insert(struct rb_node *node, struct rb_root *root){ int i = 0; struct rb_node *p = root->rb_node, *parent = NULL; struct rb_node *s[1024] = {0, }; while (p) { PUSH_S(s, p, i); if (node->key < p->key) p = p->left; else p = p->right; } node->left = node->right = NULL; parent = TOP_S(s, i); if (parent == NULL) { node->color = RB_BLACK; root->rb_node = node; } else { node->color = RB_RED; if (node->key < parent->key) parent->left = node; else parent->right = node; if (parent->color == RB_RED) rb_np_insert_color(node, root, s, i); }}
- 红黑树插入的栈实现
- 红黑树的插入实现
- 红黑树的插入的实现
- 红黑树插入算法的实现
- 红黑树的插入C实现
- 高效实现红黑树的插入--c实现
- 红黑树的节点插入算法实现
- 红黑树插入操作的C++实现
- 红黑树的实现——插入
- java实现红黑树的插入与调整
- java实现红黑树的插入节点
- 插入排序的实现
- 二分法插入的实现
- 插入排序的实现
- 插入排序的实现
- 插入排序的实现
- 插入排序的实现
- 插入排序的实现
- 2013-05-13
- 图片,音频,视频文件的上传 以及图片缩略图的制作,音频文件时长的获取以及 视频文件缩略图的获取
- 进程和线程的区别
- 体内湿气不排出,永远睡不饱
- 从linux内核启动说起(二)
- 红黑树插入的栈实现
- A+B Format (20)
- 常用的Python命令
- 获取android源码时repo的错误
- 方法签名
- VS2010 Qt配置
- Svnsync如何实现同步,以及出现的各种问题?
- C#中多线程的参数传递
- 用c写的一个栈的链表实现