1. 排序二叉树

排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。

排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 它的左、右子树也分别为排序二叉树。

图 1 显示了一棵排序二叉树:

图 1. 排序二叉树

对排序二叉树,若按中序遍历就可以得到由小到大的有序序列。如图 1 所示二叉树,中序遍历得:

{2,3,4,8,9,9,10,13,15,18}

1.1 创建排序二叉树

创建排序二叉树的步骤,也就是不断地向排序二叉树添加节点的过程,向排序二叉树添加节点的步骤如下:

  1. 以根节点当前节点开始搜索。
  2. 拿新节点的值和当前节点的值比较。
  3. 如果新节点的值更大,则以当前节点的右子节点作为新的当前节点;如果新节点的值更小,则以当前节点的左子节点作为新的当前节点。
  4. 重复 2、3 两个步骤,直到搜索到合适的叶子节点为止。
  5. 将新节点添加为第 4 步找到的叶子节点的子节点;如果新节点更大,则添加为右子节点;否则添加为左子节点。
1.2删除排序二叉树中的节点

当程序从排序二叉树中删除一个节点之后,为了让它依然保持为排序二叉树,程序必须对该排序二叉树进行维护。维护可分为如下几种情况:

(1)被删除的节点是叶子节点,则只需将它从其父节点中删除即可。

(2)被删除节点 p 只有左子树,将 p 的左子树 pL 添加成 p 的父节点的左子树即可;被删除节点 p 只有右子树,将 p 的右子树 pR 添加成 p 的父节点的右子树即可。

(3)若被删除节点 p 的左、右子树均非空,有两种做法:

  • 将 pL 设为 p 的父节点 q 的左或右子节点(取决于 p 是其父节点 q 的左、右子节点),将 pR 设为 p 节点的中序前趋节点 s 的右子节点(s 是 pL 最右下的节点,也就是 pL 子树中最大的节点)。
  • 以 p 节点的中序前趋或后继替代 p 所指节点,然后再从原排序二叉树中删去中序前趋或后继节点即可。(也就是用大于 p 的最小节点或小于 p 的最大节点代替 p 节点即可)。

2.平衡二叉树

平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法 平衡二叉树的常用算法有红黑树、AVL、Treap等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。

3.红黑树

3.1红黑树的性质

红黑树在原有的排序二叉树增加了如下几个要求:

  • 性质 1:每个节点要么是红色,要么是黑色。
  • 性质 2:根节点永远是黑色的。
  • 性质 3:所有的叶节点都是空节点(即 null),并且是黑色的。
  • 性质 4:每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
  • 性质 5:从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。

Java 中实现的红黑树可能有如图 6 所示结构:

图 6. Java 红黑树的示意

备注:本文中所有关于红黑树中的示意图采用白色代表红色。黑色节点还是采用了黑色表示。

根据性质 5:红黑树从根节点到每个叶子节点的路径都包含相同数量的黑色节点,因此从根节点到叶子节点的路径中包含的黑色节点数被称为树的“黑色高度(black-height)”。

性质 4 则保证了从根节点到叶子节点的最长路径的长度不会超过任何其他路径的两倍。假如有一棵黑色高度为 3 的红黑树:从根节点到叶节点的最短路径长度是 2,该路径上全是黑色节点(黑节点 - 黑节点 - 黑节点)。最长路径也只可能为 4,在每个黑色节点之间插入一个红色节点(黑节点 - 红节点 - 黑节点 - 红节点 - 黑节点),性质 4 保证绝不可能插入更多的红色节点。由此可见,红黑树中最长路径就是一条红黑交替的路径。

红黑树和平衡二叉树

红黑树并不是真正的平衡二叉树,但在实际应用中,红黑树的统计性能要高于平衡二叉树,但极端性能略差。

由此我们可以得出结论:对于给定的黑色高度为 N 的红黑树,从根到叶子节点的最短路径长度为 N-1,最长路径长度为 2 * (N-1)。

提示:排序二叉树的深度直接影响了检索的性能,正如前面指出,当插入节点本身就是由小到大排列时,排序二叉树将变成一个链表,这种排序二叉树的检索性能最低:N 个节点的二叉树深度就是 N-1。

红黑树通过上面这种限制来保证它大致是平衡的——因为红黑树的高度不会无限增高,这样保证红黑树在最坏情况下都是高效的,不会出现普通排序二叉树的情况。

由于红黑树只是一个特殊的排序二叉树,因此对红黑树上的只读操作与普通排序二叉树上的只读操作完全相同,只是红黑树保持了大致平衡,因此检索性能比排序二叉树要好很多。

但在红黑树上进行插入操作和删除操作会导致树不再符合红黑树的特征,因此插入操作和删除操作都需要进行一定的维护,以保证插入节点、删除节点后的树依然是红黑树

排序二叉树,平衡二叉树和红黑树的概念以及相关的操作讲解相关推荐

  1. 二叉树、平衡二叉树、红黑树、B-树、B+树、B*树、T树之间的详解和比较

    ====================================================|| 欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业) ======== ...

  2. 数据结构知识点总结-树、二叉树、二叉树遍历、满二叉树、完全二叉树、查找二叉树、平衡二叉树、红黑树、B树、B+树

    树 在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把它叫做 ...

  3. 数据结构(二叉树、二叉查找树、平衡二叉树、红黑树)

    #博学谷IT学习技术支持# 文章目录 数据结构 1. 二叉树 二叉树的特点 二叉树结构图 2. 二叉查找树 二叉查找树的特点 二叉查找树结构图 二叉查找树和二叉树对比结构图 二叉查找树添加节点规则 3 ...

  4. 数据结构树、二叉树、完全二叉树、二叉查找树、平衡二叉树、红黑树、B+树

    树.二叉树.平衡二叉树.二叉搜索树 树的前序遍历.中序遍历和后序遍历 树的前序遍历.中序遍历和后续遍历是以遍历时根所在的位置顺序命名的.层次遍历即按层从上至下,从左至右遍历即可. 前序遍历:根-> ...

  5. 【二叉树进阶】红黑树(Red Black Tree) - 平衡二叉搜索树

    文章目录 一.红黑树的概念 二.红黑树的性质 2.1 红黑树和AVL树效率对比 三.红黑树的结构(KV模型) 四.红黑树的插入 4.1 插入节点 4.2 平衡化操作(难点) 4.2.1 情况一 4.2 ...

  6. 【数据结构与算法】平衡二叉树、红黑树

    1.树.二叉树 2.二叉查找树 3.平衡二叉树.红黑树 4.递归树 一,什么是"平衡二叉查找树" 1,定义:二叉树中任意一个节点的左右子树的高度相差不能大于1. 所以:完全二叉树, ...

  7. (王道408考研数据结构)第五章树-第四节4:红黑树基本概念及操作

    文章目录 一:红黑树基本概念 (1)什么是红黑树 (2)红黑树的性质 (3)为什么要给空结点(NIL)上色? (4)为什么最长路径一定不超过最短路径的2倍? (5)红黑树效率 二:红黑树的实现 (1) ...

  8. b - 数据结构实验之查找二:平衡二叉树_二叉树、平衡二叉树、红黑树、B树、B+树与B*树...

    一.二叉树 1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图: 基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点. ...

  9. 二叉树、平衡二叉树、红黑树、BTree、B+Tree的区别和联系

    1.二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值. 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为 ...

最新文章

  1. 【Flutter】ListView 列表高级功能 ( ScrollController 上拉加载更多 )
  2. 什么原因?全球许多网络提供商推迟部署IPv6
  3. CentOS7密码忘记解决方法GRUB菜单加密
  4. Boost:双图bimap与Boost xpressive的测试程序
  5. python练习题:列表排序
  6. leetcode 178. 分数排名(SQL)
  7. “农业大数据”专题征文通知
  8. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient 1
  9. 就算神游 之五:东京迪斯尼乐园 1
  10. Android项目文件的目录结构(1)
  11. Julia :where
  12. (转)Matlab映射表数据结构(containers.Map)
  13. segmentation_models.pytorch实战:使用segmentation_models.pytorch图像分割框架实现对人物的抠图
  14. Cobble Web 页面操作记录
  15. 电脑配置单5(自用勿删)
  16. 短视频三要素之封面,如何设计引人关注的封面呢?
  17. 搜索引擎核心读书心得2:暗网抓取
  18. Android之发送短信的两种方式
  19. Eclipse 免安装(便携版)从官网如何下载
  20. 缓存模式【缓存使用几种模式】【刘新宇】

热门文章

  1. 关于纹理合成的Matlab教程
  2. JavaScript比较日期大小(js比较日期大小)
  3. OCS2工具包安装问题记录
  4. fpga图像处理(基于sd卡图像读取和显示)
  5. lutris tkg_Lutris:简化Linux游戏管理
  6. 用 Webpack 来搭建 Vue.js 的开发环境
  7. 20个为前端开发者准备的文档和指南
  8. 用Java制作简单的计算器
  9. JS实现alert中显示换行的方法
  10. 设计产品主图要注意哪些细节