您的位置:首页 > 其它

AVL平衡树的实现(2)

2015-02-17 20:17 197 查看
3.在树中插入元素

AvlTree Insert(int x, AvlTree &T) //插入元素
{
if (T == NULL)
{
T = (AvlNode *)malloc(sizeof(AvlNode));
//没有写内存不足情况代码,需要请自行添加
T->Data = x;
T->Height = 0;
T->Left = T->Right = NULL;
}
else if (x < T->Data)
{
T->Left = Insert(x, T->Left);
if (Height(T->Left) - Height(T->Right) == 2)
if (x < T->Left->Data)
T = SingleRotateWithLeft(T);
else
T = DoubleRotataeWithLeft(T);
}
else if (x > T->Data)
{
T->Right = Insert(x, T->Right);
if (Height(T->Right) - Height(T->Left) == 2)
if (x>T->Right->Data)
T = SingleRotateWithRight(T);
else
T = DoubleRotataeWithRight(T);
}

T->Height = Max(Height(T->Left), Height(T->Right)) + 1;
return T;
}


4.对插入元素的单双旋转操作:
static Position SingleRotateWithLeft(Position k2) //左单旋转 LL
{
Position k1;
k1 = k2->Left;
k2->Left = k1->Right;
k1->Right = k2;
k2->Height = Max(Height(k2->Left), Height(k2->Right)) + 1;
k1->Height = Max(Height(k1->Left), k2->Height) + 1;
return k1;
}

static Position DoubleRotataeWithLeft(Position k3) //左双旋转 LR
{
k3->Left = SingleRotateWithLeft(k3->Left);
return SingleRotateWithLeft(k3);
}

static Position SingleRotateWithRight(Position k2) //右单旋转 RR
{
Position k1;
k1 = k2->Right;
k2->Right = k1->Left;
k1->Left = k2;
k2->Height = Max(Height(k2->Right), Height(k2->Left)) + 1;
k1->Height = Max(Height(k1->Right), k2->Height) + 1;
return k1;
}

static Position DoubleRotataeWithRight(Position k3) //右双旋转 RL
{
k3->Right = SingleRotateWithRight(k3->Right);
return SingleRotateWithRight(k3);
}

对于单双旋转操作的理解可以参考这位大神的文章: 点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 二叉树