什么是红黑树

什么是cas

本篇文章是类似笔记的形式。文笔写不好,而且会大量摘抄别人的文章。

  • 参考视频 https://www.bilibili.com/video/BV1UJ411J7CU

什么是树

树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。
把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
树有很多种,向上面的一个节点有多余两个的子节点的树,称为多路树,而每个节点最多只能有两个子节点的一种形式称为二叉树。
①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。
②、边:连接节点的线称为边,边表示节点的关联关系。一般从一个节点到另一个节点的唯一方法就是沿着一条顺着有边的道路前进。在Java当中通常表示引用。


image.png

术语

image.png
  1. 路径 : 顺着节点的边从一个节点走到另一个节点,所经过的节点的顺序排列就称为路径。
  2. : 树顶端的节点称为根。一颗树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点都必须有且只有一条路径。A 是根节点。
  3. 父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点。
  4. 子节点; 一个节点含有的子树的节点称为该节点的子节点;F、G是C节点的子节点。
  5. 兄弟节点: 具有相同父节点的节点互称为兄弟节点;F、G节点互为兄弟节点。
  6. 叶节点: 没有子节点的节点称为叶节点,也叫叶子节点,比如上图的H、E、F、G都是叶子节点。
  7. 子树: 每个节点都可以作为子树的根,它和它所有的子节点、子节点的子节点等都包含在子树中。
  8. 节点的层次: 从根开始定义,根为第一层,根的子节点为第二层,以此类推。
  9. 深度: 对于任意节点n,n的深度从根到n的唯一路径长,根的深度为0 (从上往下看)
  10. 高度: 对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;(从下往上看)

二叉树

树的每个节点最多只能有两个子节点。


image.png

上图的第一幅图B节点有DEF三个子节点,就不是二叉树,称为多路树
而第二幅图每个节点最多只有两个节点,是二叉树,并且二叉树的子节点称为“左子节点”和“右子节点”

二叉搜索树

如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。

https://note.youdao.com/ynoteshare1/index.html?id=c90f95e292275df28c8f33d5196c37d8&type=note?auto

二叉搜索树要求

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

查找节点

查找某个节点,我们必须从根节点开始查找。
  ①、查找值比当前节点值大,则搜索右子树;
  ②、查找值等于当前节点值,停止搜索(终止条件);
  ③、查找值小于当前节点值,则搜索左子树;

插入节点

要插入节点,必须先找到插入的位置。与查找操作相似,由于二叉搜索树的特殊性,待插入的节点也需要从根节点开始进行比较,小于根节点则与根节点左子树比较,反之则与右子树比较,直到左子树为空或右子树为空,则插入到相应为空的位置。

遍历节点

遍历树是根据一种特定的顺序访问树的每一个节点。比较常用的有前序遍历,中序遍历和后序遍历。而二叉搜索树最常用的是中序遍历。
  ①、中序遍历:左子树——》根节点——》右子树
  ②、前序遍历:根节点——》左子树——》右子树
  ③、后序遍历:左子树——》右子树——》根节点

image.png

AVL树

1、具有二叉查找树的全部特性。
2、每个节点的左子树和右子树的高度差至多等于1。

正确
错误

平衡树基于这种特点就可以保证不会出现大量节点偏向于一边的情况了!(插入或者删除时,会发生左旋、右旋操作,使这棵树再次左右保持一定的平衡)

为什么有了平衡树还需要红黑树?
虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在 O(logn),不过却不是最佳的,
因为平衡树要求每个节点的左子树和右子树的高度差至多等于1,这个要求实在是太严了,导致每次进行插入/删除节点的时候,
几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。
显然,如果在那种插入、删除很频繁的场景中,平衡树需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树!!!

红黑树

https://note.youdao.com/ynoteshare1/index.html?id=9b50b184f00f75af266fd53e334bb819&type=note

红黑树的性质

  • 性质1:每个节点要么是黑色,要么是红色。
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色。
  • 性质4:每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相连。
  • 性质5:任意一节点到每个叶子节点的路径都包含数量相同的黑结点。俗称:黑高!
  • 性质5.1:从性质5又可以推出:如果一个节点存在黑子节点,那么该结点肯定有两个子节点
image.png

红黑树并不是一个完美平衡二叉查找树,从图上可以看到,根结点P的左子树显然比右子树高,
但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。
所以我们叫红黑树这种平衡为黑色完美平衡。

你可能感兴趣的:(什么是红黑树)