- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
树的定义 树是由 n (n ? 0) 个结点组成的有限集合。如果 n = 0,称为空树;如果 n 0,则 有一个特定的称之为根的结点,它只有直接后继,但没有直接前驱; 除根以外的其它结点划分为 m (m ? 0) 个 互不相交的有限集合T0, T1, …, Tm-1,每个集合又是一棵树,并且称之为根的子树。每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。 * 树的定义 节点:表示树中的元素,包括数据元素的内容及其指向其子树的分支。 节点的度:节点的分支数。 终端节点(叶子):度为0的节点。 非终端节点:度不为0的节点。 节点的层次:树中根节点的层次为1,根节点子树的根为第2层,以此类推。 树的度:树中所有节点度的最大值。 树的深度:树中所有节点层次的最大值。 有序树、无序树:如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。 * 树的定义 森林:是m(m≥0)棵互不相交的树的集合。 在树结构中,节点之间的关系又可以用家族关系描述,定义如下。 孩子、双亲:某个节点的子树的根称为这个节点的孩子,而这个节点又被称为孩子的双亲。 子孙:以某节点为根的子树中的所有节点都被称为该节点的子孙。 祖先:从根节点到该节点路径上的所有节点。 兄弟:同一个双亲的孩子之间互为兄弟。 堂兄弟:双亲在同一层的节点互为堂兄弟。 * 6.4 二叉树 二叉搜索树(BST):节点有序的二叉树,遵循:根的左分支节点值都小于根节点值;右分支节点值都大于根节点值;所有的子树也都是二叉搜索树 * 自平衡二叉搜索树:所有叶子节点深度差不超过 1的二叉搜索树。 自平衡二叉搜索树指其操作试图维持(半)平衡的二叉搜索树 * 平衡树 平衡树包括很多种类,常见的有B树、AVL树、红黑树等。这些树都大致平衡,能保证最坏情况下为O(logN)的性能,因此广受大家的欢迎。 但是由于平衡机制的不同,这些树都有着不同的应用场景和不同的统计性能,其中B树主要用于文件系统、数据库等方面,而AVL树和红黑树多用于检索领域。 由于红黑树在平衡机制上比较灵活,因此能取得最好的统计性能,在Linux内核、STL源码中广为使用。 * 1、红黑树:Linux主要的平衡二叉树。具有特殊的着色属 性,或红色或黑色。遵循以下属性从而维护半平衡结构: 所有节点为红色或黑色 叶子节点都是黑色 叶子节点不包含数据 所有非叶子节点都有两个子节点 如果一个节点是红色,则它的子节点都是黑色 在一个节点到其叶子节点的路径中,如果总是包含同样数目的黑色节点,则该路径相比其他路径是最短的 上述条件保证最深的叶子节点的深度不会大于两倍的最 浅叶子节点的深度。 * 2、rbtree: lib/rbtree.c 根节点:struct rb_root root = RB_ROOT; 其它节点:rb_node * 红黑树搜索实例: 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 offset) n = n-rb_left; else if (offset offset) n = n-rb_right; else return page; } return NULL; } * 代码说明:在页高速缓存中搜索一个文件区(由一个i节点和 一个偏移量共同描述)。每个i节点都有自己的rbtree,以关联 在文件中的页偏移,rb_search_page_cache函数搜索给定i节 点的rbtree,以寻找匹配的偏移值 具体实现是在while循环中遍历了整个rbtree,offset将决定是 向左或是向右遍历。If和else条件实现了rbtree的比较方法, 确保了树的有序性。如果循环中找到了一个匹配offset的节 点,则搜索完成,并返回对应的page结构。 * 红黑树插入实例: struct page * rb_insert_page_cache(struct inode *inode, unsigned long offset, struct rb_node *node) { struct rb_node **p = inode-i_rb_page_cache.rb_node; struct rb_node *parent = NULL; struct page *page; whil
文档评论(0)