二叉树的意思是:任何节点最多只能有两个子节点的树。

  二叉搜索树可提供log(N)的元素插入和访问,它的节点旋转规则是:任何节点的键值一定大于其左子节点树中的每个节点的键值,并小于其右子树中的每个节点的键值。因此,从树节点一直往左走到底,即得最小元素;从根节点一直往右走到底,却得最大元素。

  但是,由于插入值无规律,二叉搜索树可能失去平衡,造成搜索效率低落的情况。解决办法就是尽量使树形左右“平衡”,对于何为“平衡”,没有一个绝对的定义,大致的意思就是“没有一个节点过深”。常见的平衡二叉树有AVL-tree, RB-tree, AA-tree,它们都比上面说的一般二叉树复杂,插入节点和删除节点时要做一些额外操作来维护树形平衡,但是它们可以避免极难应付的极不平衡的情况,而且由于它们总是保持某种程度的平衡,所以元素访问时间平均而言就比较少。

  SGI STL实现的搜索树是RB-tree,它在一般二叉树的基础上增加了以下必须满足的条件:

  1.每个节点不是红色就是黑色;

  2.根节点为黑色;

  3.如果节点为红,其子节点必须为黑,如果节点为黑,则随意;

  4.任一节点到树尾端的任何路径(比如从根节点到任意一个叶节点),所含的黑节点数量必须相同。

  根据规则4,新增节点必须为红色;根据规则3,新增节点的父节点必须为黑。当新节点根据一般二叉树搜索规则到达其插入点,却未能符合上述条件时,就必须调整节点颜色和旋转树形。注意经过调整后,叶节点可能为黑色。

  针对不同情况,调整和旋转操作可以分成以下四类,见图(取自侯捷《STL源码剖析》):

  RB-tree的用法:

  begin()函数获取最左(最小)的节点处,end()获取的是根结点(由于使用了一个实现上的技巧,其实并不是真的根结点);

  empty(), size(), max_size()根据名字可知其意义;

  insert_unique(const value_type& x)将x插入RB-tree中,保持节点值独一无二;

  insert_equal(const value_type& x)将x插入RB-tree中,允许节点值重复。

rb_tree<int, int, identity<int>, less<int>> itree;
cout<<itree.size()<<endl;   // 0
itree.insert_unique(10);    // __rb_tree_rebalance
itree.insert_unique(7);     // __rb_tree_rebalance
itree.insert_unique(8);     // __rb_tree_rebalance// __rb_tree_rotate_left// __rb_tree_rotate_right
itree.insert_unique(15);    // __rb_tree_rebalance
itree.insert_unique(5);     // __rb_tree_rebalance
itree.insert_unique(6);     // __rb_tree_rebalance// __rb_tree_rotate_left// __rb_tree_rotate_right
itree.insert_unique(11);    // __rb_tree_rebalance// __rb_tree_rotate_right// __rb_tree_rotate_left
itree.insert_unique(13);    // __rb_tree_rebalance
itree.insert_unique(12);    // __rb_tree_rebalance// __rb_tree_rotate_right
cout<<itree.size()<<endl;   // 9rb_tree<int, int, identity<int>, less<int>>::iterator it;
for( it = itree.begin(); it != itree.end(); it++)cout<<*it<<' ';  // 5 6 7 8 10 11 12 13 15
it = itree.find( 8);
itree.insert_unique(15);
itree.insert_unique(5);
itree.insert_unique(6);

tree, RB-tree(红黑树)相关推荐

  1. 红黑树(一)之 原理和算法详细介绍---转帖

    目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sky W ...

  2. Java数据结构与算法:红黑树

    概要 概述:R-B Tree,又称为"红黑树".本文参考了<算法导论>中红黑树相关知识,加之自己的理解,然后以图文的形式对红黑树进行说明.本文的主要内容包括:红黑树的特 ...

  3. 数据结构和算法分析: 红黑树

    1. 前言 红黑树是二叉搜索树的一种, 为什么要设计红黑树呢?主要原因是二叉搜索树上面的操作,比如search.insert.delete的一些操作的,其时间复杂度为O(h).主要和树的深度有关.因此 ...

  4. 红黑树(一)之 原理和算法详细介绍

    出处:http://www.cnblogs.com/skywang12345/p/3245399.html 概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树 ...

  5. 数据结构 - 红黑树

    数据结构 - 红黑树 - 面试常问知识点 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. 本文主 ...

  6. 红黑树 —— 原理和算法详细介绍

    红黑树 -- 原理和算法详细介绍 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位 ...

  7. 哈希表和红黑树的对比

    哈希表           表: 存储数据 key –> value; 用表来存储数据结构的困难: 查找困难.一个一个key去比较去查找,效率不高.因此有了Hash算法加快查找.         ...

  8. 红黑树的java实现

    概念 红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代 ...

  9. 经典算法研究系列:五、红黑树算法的实现与剖析

                         红黑树算法的层层剖析与逐步实现 ---- 作者 July  二零一零年十二月三十一日 本文主要参考:算法导论第二版 本文主要代码:参考算法导论. 本文图片来源 ...

  10. 红黑树(一)的原理和算法详细介绍

    红黑树的原理和算法的详细介绍 目录 概要 一.R-B Tree简介 二.R-B Tree应用场景及时间复杂度 三.R-B Tree的基本操作(一) 左旋和右旋 1.左旋 2.右旋 四.R-B Tree ...

最新文章

  1. 自动驾驶软件工程之全局规划
  2. sqlserver往oracle写数据,Sqlserver连接oracle进行读写数据库
  3. leetcode算法题--一周中的第几天
  4. axios不发起请求_axios无法发起跨域请求
  5. 小试---EF5.0入门实例1
  6. 图论 —— 网络流 —— 费用流 —— MCMF 算法
  7. docker开启mysql的binlog日志
  8. oracle给日期加特定天数,oracle按照日期求连续天数的数据sql
  9. 【CCNA考试】2010-06-14-河北-936(PASS)
  10. 我要注册一个邮箱,如何注册邮箱正确格式?
  11. spark MLlib机器学习教程
  12. python爬虫由浅入深8---基于正则表达式查询的淘宝比价定向爬虫
  13. 2021.05.29【NOIP提高B组】模拟 总结
  14. iOS App thinning【( 通过 LinkMap、mach-o寻找优化点)】1、段迁移rename_section减小__TEXT 段大小(需关闭 Bitcode)2、查无用方法/类/宏/图
  15. 阿里云部署SVN服务器
  16. OpenCV开发笔记(五十八):红胖子8分钟带你深入了解图像的矩(图文并茂+浅显易懂+程序源码)
  17. 模拟电子技术基础------单管共射放大电路
  18. BUUCTF-Misc-No.4
  19. 分享一个实用的数据恢复软件,Easyrecovery 附序列号
  20. 2021-08-23 多模态反讽识别系列文章阅读(一)

热门文章

  1. 任天堂国行 Switch OLED 版 评测
  2. 论文投稿指南——中文核心期刊推荐(力学)
  3. UG如何把语言改成中文,UG如何把界面语言改成中文
  4. 调研:暴恐识别(图像识别)by_xxzcc
  5. 32岁健身教练转行程序员,拿到年薪76万offer,这位大龄码农的经历引发热议
  6. 直播倒计时android,直播代码,Android实现验证码倒计时
  7. zookeeper数据迁移
  8. java象棋打谱系统
  9. 【自然语言处理】【检索】GENER:自回归实体检索
  10. dell电脑java下载_【亲测不管用】【DELL安装系统的坑】亲测UEFI启动模式的电脑安装Win10和Ubuntu双系统(dell笔记本和hp笔记本)...