AVLTree模拟实现

一、常用的搜索逻辑

1、暴力搜索 O(N)

2、二分搜索

前提是有序,可以先用O(NlogN)排序一次,后续每次查找都是logN。

缺点:快排需要容器有随机访问功能,即为顺序表等。

如果不仅要搜索,还要插入删除,此时挪动数据为0(N)

3、二叉搜索树

搜索、插入、删除均为logN

缺点:极端情况下退化为类似链表,变为O(N)

4、二叉平衡搜索树(AVL、RBT)

logN

5、多叉平衡搜索树(B树)

6、哈希表(Hash)

二、AVL树(高度平衡二叉搜索树)

平衡因子版本:bf = H(Right) - H(Left)

正常情况下,bf的取值为  -1  0  1

bf 为0时,为满二叉树  N = 2^h-1个

AVLTree模拟实现_第1张图片

三、Insert/更新平衡因子

1、作为搜索树的Insert部分

结点的定义:

AVLTree模拟实现_第2张图片

先找到要插入的位置

AVLTree模拟实现_第3张图片

插入在左子树还是右子树

AVLTree模拟实现_第4张图片

三叉链要记得更新_parent指针

2、更新平衡因子

AVLTree模拟实现_第5张图片

或者parent更新到nullptr也结束。

四、旋转

AVLTree模拟实现_第6张图片        

旋转完,parent->_bf变为0,即停止更新,break即可。

插入新节点,会一路更新平衡因子,最后只需更新parent->_bf = cur->_bf =0。

1、RotateL

AVLTree模拟实现_第7张图片

AVLTree模拟实现_第8张图片

AVLTree模拟实现_第9张图片

c只能是z,否则会提前停止更新 c所在子树的bf为0

或提前旋转:c所在子树bf为+-2

AVLTree模拟实现_第10张图片

中间判断的是parent是否为root或者ppnode是否为nullptr

2、RotateR

AVLTree模拟实现_第11张图片

AVLTree模拟实现_第12张图片

AVLTree模拟实现_第13张图片

中间判断的是parent是否为root或者ppnode是否为nullptr

3、RotateRL        

AVLTree模拟实现_第14张图片

先对 nodeR右旋,然后对parent左旋

最后根据RL的_bf调整平衡因子

4、RotateLR

AVLTree模拟实现_第15张图片

先对L左旋,然后对parent右旋

最后根据LR的_bf调整平衡因子

你可能感兴趣的:(C++人生,数据结构)