AVL树
AVL树是平衡二叉树,它可以尽可能创建“枝繁叶茂”的树,防止树枝过长过少。二叉树搜索中,会引入ASL平均查找长度的概念,表示查找所有节点的比较次数平均值。平衡二叉树的ASL相较而言较小。
思路
AVL树就是比较各个节点左右子树的深度差,当差值等于2时就需要对树结构进行改变。改变的方式有左旋、右旋、左右旋以及右左旋。判断旋转方式是看导致深度差值的结点在哪。左旋是顺时针旋转相关结点,右旋为逆时针旋转相关结点。左右旋及右左旋为左旋、右旋的组合,左右旋先右旋后左旋。
如下面图的示例:
以上图片来自陈越《数据结构》一书。
关于旋转结点的代码不是很难,RL旋和LR旋为各是两个单旋的组合,L旋和R旋的思路又都一样。因此只要搞懂一个方向的单旋即可。注意单旋时旋转结点的子结点位置的改变。具体的看代码。
代码
#include <iostream>
using namespace std;
/*avl平衡树的建立,需要判断一个节点左右两子树的深度差,差值小于2视为平衡*/
typedef struct node{
int data;
node* lchild;
node* rchild;
int height;
}*bitTree;
int max(int a,int b)
{
//用于比较子树大小
return a>b?a:b;
}
int getHeight(bitTree T)
{
//获取树的高度
int lnum,rnum,count;
if(T){
lnum = getHeight(T->lchild);
rnum = getHeight(T->rchild);
count = lnum>rnum?lnum:rnum;//比较左右子树的高度取最大值
return (count+1