红黑树

1、二叉搜索树

(1)二叉查找树

左子树不为空的话,左子树的所有结点都小于它的根结点的值,右子树不为空的话,右子树的所有结点都大于它的根结点

查找的值比当前结点值大,则搜索右子树,反之,搜索左子树

插入的时候也要从根节点开始比较,直到左子树为空或右子树为空

中序遍历元素的大小是有顺序的(从小到大)

删除的时候分为没有子结点的结点、有一个子结点的结点、有两个子结点的结点,

(2)二叉搜索树时间复杂度

数据源必须是有序数组,一次迭代查询可以清除掉一半的元素

(3)缺陷

强制依赖有序数组,才能保证性能

最大的缺陷是二叉搜索树退化为链表:效率低,达不到排除一半元素的效果

2、AVL树

(1)特点

具有二分查找树的所有特性

每一个结点的左子树与右子树的高度差至多等于1

保证不会出现大量的结点偏向于一边的情况(插入或删除的时候,左旋与右旋操作,使得树再次左右保持平衡)

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

3、红黑树

(1)定义

红黑树是一种含有红黑结点并能够自平衡的二叉查找树(左结点的小于父结点,右节点大于父结点),本质是为了解决二叉搜索树的平衡问题

二叉查找树是一棵非平衡的树:在下面的例子中二叉树退化成了链表结构

(2)性质

每一个结点要么是黑色要么是红色

根结点、叶子结点(NIL)是黑色

每个红色结点的两个子结点一定是黑色(不能有两个红色结点)

任意一个结点到每一个叶子结点的路径都包含相同的黑色结点

4、红黑树的自平衡性

红黑树的自平衡包括:变色和旋转(左旋与右旋,顺时针为右旋),旋转要有圆心,有方向,旋转结点围绕子结点旋转(子结点为圆心)

(1)左旋

 (2)右旋

 (3)查找

 从P开始查找,大于P的话向左查找,在与G比较... ...

(4)增加

三个点之间的关系:

CPG(当前、父、祖父)三点一线:

 CPG三角:

 三个点要么是三角关系要么是三点一线关系。

增加:

  • 空树:新增的结点就是父结点

  • 父结点为黑色

  • 父结点为红色,叔叔结点为红色

  • 父结点为红色,叔叔结点为黑色或空

原文地址:https://www.cnblogs.com/zhai1997/p/13455952.html