深入理解STL之RBTree.doc

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深入理解STL之RBTree重点讲义

深入理解STL之RBTree 最近一直忙于校招的笔试,STL的深入理解系列也耽搁了好几天,再加上!红黑树真的是超级超级难理解,超级超级复杂,参考了好多博客上的大神的理解才稍微明白一点,勉强入个门,下面请以一个菜鸟的角度跟着我一起学习STL的红黑树吧。 概述 红黑树是平衡二叉有哪些信誉好的足球投注网站树的一种,其通过特定的操作来保持二叉查找树的平衡。首先,我们来复习一下二叉查找树的知识,建议如果对二叉查找树不理解的先去搜一下相关博客来了解一下。 二叉有哪些信誉好的足球投注网站树是指一个空树或者具有以下性质的二叉树: 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节点 我们知道,一颗由n个节点随机构造的二叉有哪些信誉好的足球投注网站树的高度为logn,但是,由于输入值往往不够随机,导致二叉有哪些信誉好的足球投注网站树可能失去平衡,造成有哪些信誉好的足球投注网站效率低下的情况。从而,引出了平衡二叉有哪些信誉好的足球投注网站树的概念。对于“平衡”这个约束不同的结构有不同的规定,如AVL树要求任何节点的两个子树的高度最大差别为1,可谓是高度平衡啊;而红黑树仅仅确保没有一条路径会比其他路径长出两倍,因而达到接近平衡的目的。红黑数不仅是一个平衡二叉有哪些信誉好的足球投注网站树,而且还定义了相当多的约束来确保插入和删除等操作后能达到平衡。 那么,红黑树究竟是怎么定义,来使得能够达到平衡的目的呢?我们接着看下去。 红黑树的定义 红黑树既然属于二叉有哪些信誉好的足球投注网站树的一种,当然需要满足上述二叉有哪些信誉好的足球投注网站树的性质,除此之外,红黑树还为每一个节点增加了一个存储位来表示节点的颜色属性,它可以为red或者black,通过对任何一条从根到叶子节点的路径上每个点进行着色方式的限制,来确保没有一条路径会比其他路径长出两倍,因而达到接近平衡的目的。 那么,红黑树是如何进行着色的呢?下面引出了红黑树的五条性质: 每个节点或者是黑色,或者是红色。 根节点是黑色。 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] 如果一个节点是红色的,则它的子节点必须是黑色的。 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 正是这五条性质,使得红黑树的高度能保持在logn,从而达到平衡的目的,进而使得其在查找、插入和删除的时间复杂度最坏为O(logn),下面就是一棵典型的红黑树。 注: 因本人能力有限可能无法将红黑树讲得很清楚全面,而且STL红黑树的实现也较为复杂,建议先到下面推荐的几篇博客里去补补知识 教你初步了解红黑树 【数据结构和算法05】 红-黑树(看完包懂~) 一步一图一代码,一定要让你真正彻底明白红黑树 红黑树的节点结构 红黑树的节点在二叉树的节点结构上增加了颜色属性,而且,为了更好的进行插入和删除操作,进而增加了指向父节点的指针。为了更好的弹性,STL红黑树的节点采用双层设计,将不依赖模板的参数提取出来,作为base结构,然后用带模板的节点结构取继承它。下面是红黑树节点结构的源码: typedef bool __rb_tree_color_type; const __rb_tree_color_type __rb_tree_red = false; // 紅色為 0 const __rb_tree_color_type __rb_tree_black = true; // 黑色為 1 struct __rb_tree_node_base { typedef __rb_tree_color_type color_type; typedef __rb_tree_node_base* base_ptr; color_type color; // 节点颜色 base_ptr parent; // 指向父节点 base_ptr left; // 指向左子节点 base_ptr right; // 指向右子节点 // 一直往左走,就能找到红黑树的最小值节点 // 二叉有哪些信誉好的足球投注网站树的性质 static base_ptr minimum(base_ptr x) { while (x-left != 0) x = x-left; return x; } // 一直往右走,就能找到红黑树的最大值节点 // 二叉有哪些信誉好的足球投注网站树的性质 static base_ptr maximum(base_ptr x) { while (x-right != 0) x = x-right; return x; } }; // 真正的节点定义,采用双层节点结构 // 基类中不包含模板参数 template class Value struct __rb_tre

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档