您的位置:首页 > 其它

AVL的插入过程

2015-08-20 16:59 337 查看
#include<iostream>
#include<algorithm>
using namespace std;

#define  ElementType int

typedef struct AVLTreeNode
{
ElementType Data;
AVLTreeNode* Left;
AVLTreeNode* Right;
int height;
}*AVLTree;

int GetHeight(AVLTree T)
{
if (T == NULL)
return 0;
else
return max(GetHeight(T->Left), GetHeight(T->Right))+1;
//return T->height;
}
AVLTree SingleLeftRotation(AVLTree T)
{
AVLTree p = T->Left;
T->Left = p->Right;
p->Right = T;
T->height = max(GetHeight(T->Left), GetHeight(T->Right)) + 1;
p->height = max(GetHeight(p->Left), T->height) + 1;
return p;
}
AVLTree SingleRightRotation(AVLTree T)
{
AVLTree p = T->Right;
T->Right = p->Left;
p->Left = T;
T->height = max(GetHeight(T->Left), GetHeight(T->Right)) + 1;
p->height = max(GetHeight(p->Left), GetHeight(p->Right))+ 1;
return p;
}
AVLTree DoubleLeftRightRotation(AVLTree T)
{
T->Left = SingleRightRotation(T->Left);
return SingleLeftRotation(T);
}
AVLTree AVL_Insertion(ElementType x, AVLTree T)
{
if (T == NULL)
{
T = (AVLTree)malloc(sizeof(AVLTreeNode));
T->Data = x;
T->height = 0;
T->Left = T->Right = NULL;
}
else if (x < T->Data)
{
T->Left=AVL_Insertion(x, T->Left);
if (GetHeight(T->Left) - GetHeight(T->Right) == 2)
{
if (x < T->Left->Data)//左左
{
T = SingleLeftRotation(T);
}
else //左右
{
T = DoubleLeftRightRotation(T);
}

}
}
else if (x>T->Data)
{
T->Right = AVL_Insertion(x, T->Right);
if (GetHeight(T->Left) - GetHeight(T->Right) == -2)
{
if (x > T->Right->Data)
T = SingleLeftRotation(T);
else
T = DoubleLeftRightRotation(T);
}
}
T->height = max(GetHeight(T->Left), GetHeight(T->Right)) + 1;
return T;
}
void PreOrderTraversal(AVLTree T)
{
if (T)
{
printf("%d ", T->Data);
PreOrderTraversal(T->Left);

PreOrderTraversal(T->Right);
}
}
int main()
{
AVLTree T = NULL;
T=AVL_Insertion(564, T);
T=AVL_Insertion(460,T);
T=AVL_Insertion(546, T);
PreOrderTraversal(T);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: