二叉树
二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大于 2 的节点,二叉树的数据结构如下图所示
这是一棵拥有 6 个节点深度为 2(深度从 0 开始),并且根节点为 3 的二叉树
二叉树有两个分支通常被称作“左子树”和“右子树”,而且这些分支具有左右次序不能随意地颠倒
二叉查找/搜索/排序树
一棵空树或者满足以下性质的二叉树被称之为二叉查找树
若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值;
任意节点的左、右子树分别为二叉查找树
平衡二叉查找树/平衡二叉树
平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度
它是一棵空树
或它的 左右两个子树的高度差(平衡因子)的绝对值不超过1
并且左右两个子树都是一棵平衡二叉树,
同时,平衡二叉树必定是二叉搜索树,反之则不一定
或 每个结点的平衡因子都为 1、-1、0 的二叉排序树
平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义)
红黑树
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种平衡二叉树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树和平衡二叉树都是 特殊的 二叉搜索树
都是基于 二叉搜索树 做出的改良
红黑树除了具备二叉查找树的基本特性之外,还具备以下特性
节点是红色或黑色;
根节点是黑色;
所有叶子都是黑色的空节点(NIL 节点);
每个红色节点必须有两个黑色的子节点,也就是说从每个叶子到根的所有路径上,不能有两个连续的红色节点;
从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑色节点
特性(3)中的叶子节点,是只为空(NIL或null)的节点。
特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树
红黑树优势
红黑树的优势在于它是一个平衡二叉查找树,对于普通的二叉查找树(非平衡二叉查找树)在极端情况下可能会退化为链表的结构,例如,当我们依次插入 3、4、5、6、7、8 这些数据时,二叉树会退化为如下链表结构
当二叉查找树退化为链表数据结构后,再进行元素的添加、删除以及查询时,它的时间复杂度就会退化为 O(n);而如果使用红黑树的话,它就会将以上数据转化为平衡二叉查找树,这样就可以更加高效的添加、删除以及查询数据了,这就是红黑树的优势
红黑树的高度近似 logn,它的添加、删除以及查询数据的时间复杂度为 O(logn)
实现自平衡
红黑树能够实现自平衡和保持红黑树特征的主要手段是:变色、左旋和右旋
左旋指的是围绕某个节点向左旋转,也就是逆时针旋转某个节点,使得父节点被自己的右子节点所替代,如下图所示
右旋指的是围绕某个节点向右旋转,也就是顺时针旋转某个节点,此时父节点会被自己的左子节点取代,如下图所示