数据结构-06 | 平衡二叉查找树| AVL树| 红黑树 (3)

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

4. 右左旋

  

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

这里C < B,把它右旋上去,B挪下来,这样这个树还是满足二叉搜索树的性质

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

因为树的查找性能在于它的深度,记录它的左右子树深度即可,同时保证任何时候任何一个结点它的左右子树的深度差不超过绝对值1,

当它不平衡时,基础的情况是上边四种,用左右旋来维护平衡。

如果结点本身有子树的情况,它要进行左右旋和右左旋怎么办

5.3 带有子树的旋转

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

上图进行右旋操作:
     E移上来,S往下之后E的右子树要挂在S的左子树去;

参考动画: https://zhuanlan.zhihu.com/p/63272157 

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

右旋:

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

插入3后变成如上图所示树的形态。这时它就变成-2了,就变成左左型了,把5往上提10挪下去,8挪到另外一边(8挂到10的左子树上。)

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

上图是典型的右左子树情况,先进行右旋再左旋。

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

数据结构-06 | 平衡二叉查找树| AVL树| 红黑树

 

5.4 AVL总结

  1. 平衡二叉搜索树(而且是自平衡的)
  2. 每个结点存 balance factor = {-1, 0, 1}
  3. 四种旋转操作


不足:结点需要存储额外信息、且调整次数频繁。 (而且存储的信息是一个int类型,因为它要+-*/;频繁调整维护成本高) ==>  引入近似平衡二叉树,不需要每次非常严格的来平衡。

6. 红黑树

红黑树是一种平衡二叉查找树。是为了解决普通二叉查找树在数据更新的过程中,复杂度退化的问题而产生。红黑树的高度近似 log2n,所以它是近似平衡,插入、删除、查找操作的时间复杂度都是 O(logn)。

因为红黑树是一种性能非常稳定的二叉查找树,所以,在工程中,但凡是用到动态插入、删除、 查找数据的场景,都可以用到它。不过,它实现起来比较复杂,如果自己写代码实现,难度会有些高,这个时候,我们其实更倾向用跳表来替代它。

工程中都喜欢用红黑树这种平衡二叉查找树;红黑树“Red-Black Tree”,简称 R-B Tree,是一种不严格的平衡二叉查找树,它的定义是不严格符合平衡二叉查找树的定义的,是近似平衡二叉树的一种。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwfjd.html