代码源自《数据结构与算法分析——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树的旋转: