代码源自《数据结构与算法分析——c语言描述》
二叉查找树的基本操作:
#include<stdlib.h>
#include<stdio.h>
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
struct TreeNode
{
int data;
SearchTree Left;
SearchTree Right;
};
SearchTree MakeEmpty(SearchTree T)
{
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
Position Find(int x, SearchTree T)
{
if (T == NULL)
return NULL;
else if (x < T->data)
return Find(x, T->Left);
else if (x > T->data)
return Find(x, T->Right);
else
return T;
}
Position FindMin(SearchTree T)
{
if (T == NULL)
return NULL;
else
if (T->Left == NULL)
return T;
else
FindMin(T->Left);
}
Position FindMax(SearchTree T)
{
if (T == NULL)
return NULL;
else
if (T->Right == NULL)
return T;
else
FindMax;
}
SearchTree Insert(int x, SearchTree T)
{
if (T == NULL)
{
//创造并返回一个单节点的树
T = (SearchTree)malloc(sizeof(struct TreeNode));
if (T == NULL)
{
printf("out of space!");
exit(1);
}
else
{
T->data = x;
T->Left = T->Right = NULL;
}
}
else
if (x < T->data)
T->Left=Insert(x, T->Left);
else
if (x > T->data)
T->Right=Insert(x, T->Right);
return T;
}
SearchTree Delete(int x, SearchTree T)
{
Position Tmpcell;
if (T == NULL)
{
printf("element not found!\n");
system("pause");
exit(1);
}
else
if (x < T->data)
T->Left = Delete(x, T->Left);
else
if (x > T->data)
T->Right = Delete(x, T->Left);
else
if (T->Left&&T->Right)//有两个子树(双分支)
{
//将右子树中最小的元素替换当前节点
//实际上没有删除当前节点,而是改变其值为右子树中最小的值,并将该最小值节点删除
Tmpcell = FindMin(T->Right);
T->data = Tmpcell->data;
T->Right = Delete(T->data, T->Right);
}
else//一个或无子树
{
Tmpcell = T;
if (T->Left == NULL)
T = T->Right;
else if(T->Right == NULL)
T = T->Left;
free(Tmpcell);
}
return T;
}
void PrintElement(Position p)
{
printf("%d\t", p->data);
}
void PrintTree(SearchTree T)
{
if (T != NULL)
{
PrintTree(T->Left);
PrintElement(T);
PrintTree(T->Right);
}
}
功能测试:
int main()
{
SearchTree tree;
tree = NULL;
int temp;
char c;
do
{
printf("enter :\n");
scanf("%c", &c);
switch (c)
{
case ('i'):
printf("please enter a num you want to insert:");
scanf("%d", &temp);
tree=Insert(temp, tree);
while ((c = getchar()) != '\n')
scanf("%c", &c);
break;
case ('d'):
printf("please enter a num you want to delete:");
scanf("%d", &temp);
tree=Delete(temp, tree);
while ((c = getchar()) != '\n')
scanf("%c", &c);
break;
case('s'):
printf("we are goning to show you the data after sorted:\n");
PrintTree(tree);
while ((c = getchar()) != '\n')
scanf("%c", &c);
};
} while (c != 'e');
system("pause");
return 0;
}
avl树的旋转: