红黑树

一、二叉搜索树数组

(1)二叉查找树性能

 

 

 

左子树不为空的话,左子树的全部结点都小于它的根结点的值,右子树不为空的话,右子树的全部结点都大于它的根结点3d

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

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

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

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

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

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

(3)缺陷链表

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

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

 

二、AVL树

(1)特色

具备二分查找树的全部特性

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

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

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

 

三、红黑树

(1)定义

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

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

(2)性质

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

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

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

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

 

四、红黑树的自平衡性

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

(1)左旋

 

 

 (2)右旋

 

 

 (3)查找

 

 

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

(4)增长

三个点之间的关系:

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

 

 

 CPG三角:

 

 

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

增长:

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

 

 

 

  • 父结点为黑色

 

 

 

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

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

相关文章
相关标签/搜索