33,008
社区成员
发帖
与我相关
我的任务
分享
#ifndef __ggh
#define __ggh
typedef int ElementType;
typedef struct AVLTreeNode *AVLTree,*Position;
struct AVLTreeNode{
ElementType Date;
AVLTree left;
AVLTree right;
int Height;
};
static int Height(Position P);
AVLTree Insert(ElementType x,AVLTree T);
int Max(int a,int b);
#endif
源文件
#include "stdafx.h"
#include "gg.h"
#include "stdlib.h"
#include "stdio.h"
static AVLTree SingleRotateLeft(AVLTree T)
{
AVLTree T1=T->left;
T->left=T1->right;
T1->right=T;
T->Height=Max(Height(T->left),
Height(T->right))+1;
T1->Height=Max(Height(T1->left),
Height(T1->right))+1;
return T1;
}
static AVLTree SingleRotateRight(AVLTree T)
{
AVLTree T1=T->right;
T->right=T1->left;
T1->left=T;
T->Height=Max(Height(T->left),
Height(T->right))+1;
T1->Height=Max(Height(T1->left),
Height(T1->right))+1;
return T1;
}
static AVLTree DoubleRotataeleft(AVLTree T)
{
T->left=SingleRotateRight(T->left);
return SingleRotateLeft(T);
}
static AVLTree DoubleRotataeright(AVLTree T)
{
T->right=SingleRotateLeft(T->left);
return SingleRotateRight(T);
}
int Height(Position P)
{
if(P==NULL)
return -1;
else
return (P->Height);
}
AVLTree Insert(ElementType x,AVLTree T)
{
if(T== NULL)
{
T=(AVLTree)malloc(sizeof(AVLTree));
if(T==NULL)
printf("out of space");
else
{
T->Date=x;
T->left=T->right=NULL;
T->Height=0;
}
}
else
{
if(x<T->Date)
{
T->left=Insert(x,T->left);
if(Height(T->left)-Height(T->right)==2)
if(x<T->left->Date)
T=SingleRotateLeft(T);
else
T=DoubleRotataeleft(T);
}
else if(x>T->Date)
{
T->right=Insert(x,T->right);
if(Height(T->right)-Height(T->left)==2)
if(x>T->left->Date)
T=SingleRotateRight(T);
else
T=DoubleRotataeright(T);
}
}
T->Height=Max(Height(T->left),Height(T->right))+1;
return T;
}
AVLTree search_Tree(ElementType x,AVLTree T)
{
while(T)
{if(T->Date==x)
return T;
else if(x<T->Date)
search_Tree(x,T->left);
else
search_Tree(x,T->right);
}
return T;
}
void PreOrder(AVLTree T)//qianxubianli
{
if(T!=NULL)
{
printf("%d",T->Date);
PreOrder(T->left);
PreOrder(T->right);
}
}
void MiddleOrder(AVLTree T)
{
if(T!=NULL)
{
MiddleOrder(T->left);
printf("%d",T->Date);
MiddleOrder(T->right);
}
}
void PostOrder(AVLTree T)
{
if(T!=NULL)
{
PostOrder(T->left);
PostOrder(T->right);
printf("%d",T->Date);
}
}
int Max(int a,int b)
{
if(a>b)
return a;
else if(b>a)
return b;
else
return a;
}
int main()
{
AVLTree T=NULL;
AVLTree Q=NULL;
int a[]={12,33,66,45,78,676,434};
for(int i=0;i<7;i++)
Insert(a[i],T);
PreOrder(T);
system("pause");
}