红黑树(二)之 C语言的实现
2014-04-02 09:36
2281 查看
概要
红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到。之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现代码,后序章节再分别给出C++和Java版本的实现。还是那句话,三种实现原理相同,择其一了解即可;若文章有错误或不足的地方,望不吝指出!目录
1. 红黑树的介绍
2. 红黑树的C实现(代码说明)
3. 红黑树的C实现(完整源码)
4. 红黑树的C测试程序
转载请注明出处:https://www.geek-share.com/detail/2607402561.html
更多内容:数据结构与算法系列 目录
(01) 红黑树(一)之 原理和算法详细介绍
(02) 红黑树(二)之 C语言的实现
(03) 红黑树(三)之 Linux内核中红黑树的经典实现
(04) 红黑树(四)之 C++的实现
(05) 红黑树(五)之 Java的实现
(06) 红黑树(六)之 参考资料
红黑树的介绍
红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。
除了具备该特性之外,红黑树还包括许多额外的信息。
红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。
红黑树的特性:
(1) 每个节点或者是黑色,或者是红色。
(2) 根节点是黑色。
(3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
(4) 如果一个节点是红色的,则它的子节点必须是黑色的。
(5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
关于它的特性,需要注意的是:
第一,特性(3)中的叶子节点,是只为空(NIL或null)的节点。
第二,特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
红黑树示意图如下:
/** * C语言实现的红黑树(Red Black Tree) * * @author skywang * @date 2013/11/18 */ #include <stdio.h> #include "rbtree.h" #define CHECK_INSERT 0 // "插入"动作的检测开关(0,关闭;1,打开) #define CHECK_DELETE 0 // "删除"动作的检测开关(0,关闭;1,打开) #define LENGTH(a) ( (sizeof(a)) / (sizeof(a[0])) ) void main() { int a[] = {10, 40, 30, 60, 90, 70, 20, 50, 80}; int i, ilen=LENGTH(a); RBRoot *root=NULL; root = create_rbtree(); printf("== 原始数据: "); for(i=0; i<ilen; i++) printf("%d ", a[i]); printf("\n"); for(i=0; i<ilen; i++) { insert_rbtree(root, a[i]); #if CHECK_INSERT printf("== 添加节点: %d\n", a[i]); printf("== 树的详细信息: \n"); print_rbtree(root); printf("\n"); #endif } printf("== 前序遍历: "); preorder_rbtree(root); printf("\n== 中序遍历: "); inorder_rbtree(root); printf("\n== 后序遍历: "); postorder_rbtree(root); printf("\n"); if (rbtree_minimum(root, &i)==0) printf("== 最小值: %d\n", i); if (rbtree_maximum(root, &i)==0) printf("== 最大值: %d\n", i); printf("== 树的详细信息: \n"); print_rbtree(root); printf("\n"); #if CHECK_DELETE for(i=0; i<ilen; i++) { delete_rbtree(root, a[i]); printf("== 删除节点: %d\n", a[i]); if (root) { printf("== 树的详细信息: \n"); print_rbtree(root); printf("\n"); } } #endif destroy_rbtree(root); }
View Code
红黑树的C测试程序
前面已经给出了红黑树的测试程序(rbtree_test.c),这里就不再重复说明。下面是测试程序的运行结果:== 原始数据: 10 40 30 60 90 70 20 50 80 == 前序遍历: 30 10 20 60 40 50 80 70 90 == 中序遍历: 10 20 30 40 50 60 70 80 90 == 后序遍历: 20 10 50 40 70 90 80 60 30 == 最小值: 10 == 最大值: 90 == 树的详细信息: 30(B) is root 10(B) is 30's left child 20(R) is 10's right child 60(R) is 30's right child 40(B) is 60's left child 50(R) is 40's right child 80(B) is 60's right child 70(R) is 80's left child 90(R) is 80's right child
相关文章推荐
- C语言结构体里的成员数组和指针
- Java通过JNI调用C++程序
- C++学习之new返回值的误用-new(nothrow)
- 在java中调用c/c++代码的方法(jni)
- C语言学习之补码的深刻理解
- LeetCode 66 — Plus One(C++ Java Python)
- C语言学习之补码的深刻理解
- 堆和栈的区别
- C++面向对象(1)
- C++ const的一点总结
- C语言宏定义##连接符和#符的使用
- const const_cast
- C++操作SQLite数据库
- C++基本知识1
- c++ 编译过程
- c++输入结束与EOF
- C++ 指针的偏移 The offset of a pointer in C++
- C++类库
- C++类库
- C语言初步;简单的算法及程序;