时间: 2024-11-08 23:11:25
15 2 用于查找的高级数据结构和算法 红黑树
15 2 用于查找的高级数据结构和算法 红黑树的相关文章
15 3 用于查找的高级数据结构和算法 跳跃表
数据结构与算法-红黑树
前言 红黑树是工程中最常用到的一种自平衡二叉排序树,其和AVL树类似,都是在进行插入.删除时通过一定的调整操作来维持相对稳定的树高,从而获得较好的查询性能. 性质 1. 节点是红色或黑色. 2. 根节点是黑色. 3 每个叶节点(null节点)是黑色的. 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点. 维护红黑树形状(树高)的,主要就是4.5两条性质,性质4决定了最长的路径莫过于红黑间隔
数据结构基础(18) --红黑树的设计与实现(1)
红黑树是一种自平衡的二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组(C++ STL 中的map/set).它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的.红黑树虽然很复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目(来源百度
数据结构拾遗(1) --红黑树的设计与实现(上)
红黑树是一种自平衡的二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组(C++ STL 中的map/set).它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的.红黑树虽然很复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目(来源:
【数据结构】平衡二叉树—红黑树
红黑树有什么特征,如何保持平衡的? 它或者是一颗空树,或者是具有一下性质的二叉查找树: 1.节点非红即黑. 2.根节点是黑色. 3.所有NULL节点称为叶子节点,且认为颜色为黑. 4.所有红节点的子节点都为黑色. 5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点. 平衡分析: 稍微根据以上特征进一步扩展描述: 1.根据树的名称就可以知道,树的节点只有黑色和红色两种颜色,这也是为了保持平衡的一种限制方式(特征1). 2.树的头(根)跟尾(叶子节点)都是黑色的(特征2.3). 3.而红节
数据结构拾遗(2) --红黑树的设计与实现(中)
Insert完善 根据规则4, 新增节点必须为红; 根据规则3, 新增节点之父节点必须为黑. 示例: (1)插入16(红色)/55(红色), 则既不用旋转, 也不用重新染色 (2)插入82(红色), 则违反了红黑规则, 需要进行动态的调整; 红黑树所需的处理 1.单旋转 新插入的X与其父P都是红色的, 而且X还是G的外部孙子; 2.双旋转 新插入的X与其父P都是红色的, 而且X还是G的内部孙子; 3.还需要处理有两个红色孩子的节点, 将右儿子变成黑色的, 我们只允许左儿子是红色的;方法: 旋转+
【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)
目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j
数据结构--可迭代红黑树模板类
一.结点类与红黑树类: (一)结点类基本数据成员: 1.左右子结点指针域 2.父结点指针域,方便回访父结点 3.有序 前驱 / 后继 指针域,迭代访问元素,提供一种顺序存储的假象 4.结点颜色,利用红黑规则,保持树的平衡. (二)结点类的基本成员函数: 两个重载的构造函数,构造红色的新结点 (三)红黑树类基本数据成员: 1.头结点:保存一个据点,用来维系根节点与公用空结点 2.根结点:是红黑树的起始位置 3.空结点:作为所有空指针域的指向,一棵树只有一个 4.全局前驱.后继结点:用来使红黑树线索
数据结构基础(19) --红黑树的设计与实现(2)
双旋转 单旋转有时会出现一个问题(如下图所示): (如果内侧子孙节点[k1]过深, 则将其单向移动是不会解决问题的) 于是就有了双旋转 向右双旋转: 1.首先以k1为轴, k1与k2向左旋转; 2.然后以k3为轴, k3与旋转之后的k1向右旋转; //实现 //向右双旋转 template <typename Type> void RedBlackTree<Type>::doubleRotateWithLeftChild(Node *& k3) const { //首先将其