内核数据结构之红黑树

原创 2012年03月30日 23:58:31

红黑树是一种自平衡的二叉查找树,是Linux主要的二叉树结构。红黑树有一个特殊的颜色属性,要么红色,要么黑色。红黑树通过强制以下条件来保证红黑树仍然是半平衡的。

  • 所有结点要是红色或黑色的。

  • 叶子结点是黑色的。

  • 叶子结点不包含数据。

  • 所有非叶子结点有两个孩子。

  • 如果一个结点是红色,那么它的两个孩子都为黑色。

  • 从某个结点出发,到达任何叶子结点的路径中包含的黑色结点相同。

上述属性表明,最深的叶子的深度不会超过最浅的叶子的深度的二倍。这样,该树总是半平衡的。

Linux中,红黑树称为rbtree。分别声明和定义在<linux/rbtree.h>lib/rbtree.c中。一个rbtree的根总是由结构rb_root来表示。为了创建一个新的红黑树,我们要分配一个新的rb_root并将其初始化为特殊值RB_ROOT

struct rb_root root = RB_ROOT

单个结点由结构rb_node来表示。由于C语言不支持泛型编程,所以rbtree并没有提供查找和插入程序,编程人员必须自行定义,不过可以使用rbtree已经提供的一些帮助函数。

红黑树查找程序实现的一个例子

struct page * rb_search_page_cache(struct inode *inode,

unsigned long offset)

{

struct rb_node *n = inode->i_rb_page_cache.rb_node;

while(n) {

struct page *page = rb_entry(n, struct page, rb_page_cache);

if(offset < page->offset)

n= n->rb_left;

else if (offset > page->offset)

n= n->rb_right;

else

return page;

}

return NULL;

}



红黑树插入程序实现的一个例子

structpage * rb_insert_page_cache(struct inode *inode,

unsignedlong offset,

structrb_node *node)

{

structrb_node **p = &inode->i_rb_page_cache.rb_node;

structrb_node *parent = NULL;

structpage *page;

while(*p) {

parent= *p;

page= rb_entry(parent, struct page, rb_page_cache);

if(offset < page->offset)

p= &(*p)->rb_left;

elseif (offset > page->offset)

p= &(*p)->rb_right;

else

returnpage;

}

rb_link_node(node,parent, p);

rb_insert_color(node,&inode->i_rb_page_cache);

returnNULL;

}


总结:何时,何地使用什么数据结构?

如果,主要的操作是迭代访问数据,使用链表。当性能不是很重要时,也可考虑使用链表。当数据项目总数相对较少时,或需要与其他内核代码进行交互时,使用链表。

如果代码符合生产者/消费者模式,使用队列,特别是你想要一个固定大小的缓冲区。

如果需要将一个UID映射到一个对象,使用映射。

如果需要存储大量的数据并要有效地查找数据,使用红黑树。但是如果这些操作不是对时间要求很高的,那么最好用链表。



linux内核分析--内核中的数据结构之红黑树(四)

红黑树由于节点颜色的特性,保证其是一种自平衡的二叉搜索树。 红黑树的一系列规则虽然实现起来比较复杂,但是遵循起来却比较简单,而且红黑树的插入,删除性能也还不错。 所以红黑树在内核中的应用非常广泛,掌握...
  • yusiguyuan
  • yusiguyuan
  • 2014年02月25日 16:13
  • 1840

linux内核分析--内核中的数据结构之红黑树(续)

#include #include #include "kn_common.h" MODULE_LICENSE("Dual BSD/GPL"); struct student { int ...
  • yusiguyuan
  • yusiguyuan
  • 2014年02月25日 16:31
  • 1500

使用内核数据结构:红黑树 rbtree

一、使用内核红黑树文件rbtree 二、代码
  • kanguolaikanguolaik
  • kanguolaikanguolaik
  • 2014年06月26日 17:49
  • 1022

红黑树视频 http://gauss.ececs.uc.edu/RedBlack/redblack.html

http://gauss.ececs.uc.edu/RedBlack/redblack.html 红黑树视频
  • wangyin159
  • wangyin159
  • 2015年12月08日 23:37
  • 565

重温数据结构:深入理解红黑树

读完本文你将了解到: 什么是红黑树黑色高度 红黑树的 5 个特性 红黑树的左旋右旋 指定节点 x 的左旋 右图转成左图 指定节点 y 的右旋左图转成右图 红黑树的平衡插入 二叉查找树的插入 插入后调整...
  • u011240877
  • u011240877
  • 2016年11月25日 00:58
  • 9807

《Linux内核设计与实现》——内部数据结构

一、链表  1、链表
  • Explorer_day
  • Explorer_day
  • 2014年11月10日 15:59
  • 982

平衡二叉树 之 红黑树

Red-Black Tree (  RBT)也是一种自平衡二叉树,其统计性能要好于 AVL树 。它是在1972年由 鲁道夫·贝尔 发明的,它现代的名字是在 Leo J. Guibas 和 Robert...
  • whucyl
  • whucyl
  • 2013年12月11日 14:36
  • 13516

内核数据结构之映射

映射也称之为关联数组,它是一组唯一键的集合,每个键与特定的值相关。一般支持至少三个操作: Add(key,value) Remove(key) value=Loo...
  • fuyajun01
  • fuyajun01
  • 2012年03月30日 23:56
  • 2177

PHP二叉树(三):红黑树

关于红黑树的原理网上的资源就挺多的,而且情况有点小复杂,所以在这里我就不再陈述了,直接上代码吧:...
  • baidu_30000217
  • baidu_30000217
  • 2016年10月26日 21:53
  • 1221

内核数据结构总结

内核数据结构 1.LIST_ENTRY  2.HASH表  3.TREE树  4.LookAside结构  一.LIST_ENTRY typedef _struct _MYDATA...
  • zhuhuibeishadiao
  • zhuhuibeishadiao
  • 2016年04月04日 02:12
  • 701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内核数据结构之红黑树
举报原因:
原因补充:

(最多只允许输入30个字)