C语言 AVL树的 非递归 方法插入

来源:互联网 发布:网络销售的工作好不好 编辑:程序博客网 时间:2024/05/18 03:21

既然开始写了博客    就准备把上学期看《数据结构与算法分析》时候写的一些算法 传到博客上。目前还没有时间添加什么注释,等什么时候有空了 再详细注释一番


这一篇是书上的习题,让写出 AVL树的非递归插入 ,现在只能依稀记得 上学期花了一个晚上的时间 费了老大老大的劲进行编写,现在具体细节已经忘了,有空加注释

>#include<stdlib.h>typedef struct Tree{int Num;Tree* Left;Tree* Right;int Height;}Tree;typedef struct Stack{Tree * tree;Stack* Next;}Stack;Stack *Head;Tree *SingleRotateWithLeft(Tree *tree);Tree *SingleRotateWithRight(Tree *tree);Tree *DoubleRotateWithRight(Tree *tree);Tree *DoubleRotateWithLeft(Tree *tree);void Push(Stack* Head, Tree* tree){Stack*Temp = NULL;if (NULL == Head->Next){Temp = (Stack*)malloc(sizeof(Stack));Temp->tree = tree;Temp->Next = NULL;Head->Next = Temp;return;}if (NULL != Head->Next){Temp = (Stack*)malloc(sizeof(Stack));Temp->tree = tree;Temp->Next = Head->Next;Head->Next = Temp;return;}}Tree* Pop(Stack*Head){if (NULL == Head->Next)return NULL;if (NULL != Head->Next){Stack * ToFree = Head->Next;Tree* Temp = ToFree->tree;Head->Next = ToFree->Next;free(ToFree);return Temp;}}int Max(int a, int b){return a>b ? a : b;}int Height(Tree*tree){if (NULL == tree)return -1;elsereturn tree->Height;}Tree* AVL_Insert(Tree *root, int num) //插入例程{Tree * tree = root;/*找到插入位置,并将路径上的节点推入栈中*/while (1){if (tree == NULL){/*生成节点*/tree = (Tree*)malloc(sizeof(Tree));tree->Num = num;tree->Left = NULL;tree->Right = NULL;tree->Height = 0;Push(Head, tree);break;}if (num < tree->Num){Push(Head, tree);tree = tree->Left;continue;}if (num > tree->Num){Push(Head, tree);tree = tree->Right;continue;}}while (1){Tree *Temp = Pop(Head);Tree* AboveTree = Pop(Head);if (AboveTree == NULL){return Temp;}/*若左节点比右节点 高 2个单位*/if (Temp->Num < AboveTree->Num){AboveTree->Left = Temp;  if (Height(AboveTree->Left) - Height(AboveTree->Right) == 2){if (num < Temp->Num)AboveTree= SingleRotateWithLeft(AboveTree);else if (num > Temp->Num)AboveTree = DoubleRotateWithLeft(AboveTree);}}else if (Temp->Num > AboveTree->Num){AboveTree->Right = Temp;if (Height(AboveTree->Left) - Height(AboveTree->Right) == -2){if (num < Temp->Num)AboveTree = DoubleRotateWithRight(AboveTree);else if (num > Temp->Num)AboveTree = SingleRotateWithRight(AboveTree);}}AboveTree->Height = Max(Height(AboveTree->Left), Height(AboveTree->Right)) + 1;Push(Head, AboveTree);}return root;}Tree *SingleRotateWithLeft(Tree *tree)   //左单旋{Tree * Temp = tree->Left;tree->Left = Temp->Right;Temp->Right = tree;tree->Height = Max(Height(tree->Left), Height(tree->Right))+1;Temp->Height = Max(Height(Temp->Left), tree->Height) + 1;return Temp;}Tree *SingleRotateWithRight(Tree *tree) //右单旋{Tree * Temp = tree->Right;tree->Right = Temp->Left;Temp->Left = tree;tree->Height = Max(Height(tree->Left), Height(tree->Right)) + 1;Temp->Height = Max(Height(Temp->Left), tree->Height) + 1;return Temp;}Tree *DoubleRotateWithRight(Tree *tree){Tree*Temp = tree->Right->Left;tree->Right = SingleRotateWithLeft(tree->Right);return SingleRotateWithRight(tree);}Tree *DoubleRotateWithLeft(Tree *tree){Tree*Temp = tree->Left->Right;tree->Left = SingleRotateWithRight(tree->Left);return SingleRotateWithLeft(tree);}void Traversing(Tree*tree, int Depth)   //先序遍历输出数组{if (NULL == tree)return;for (int i = 0; i < Depth; i++)printf("   ");printf("%d\n", tree->Num);Traversing(tree->Left, Depth + 1);Traversing(tree->Right, Depth + 1);return;}int main(void){Head = (Stack*)malloc(sizeof(Stack));Head->Next = NULL;Head->tree = NULL;Tree*tree = NULL;for (int i = 1; i<55; i++){tree = AVL_Insert(tree, i);}Traversing(tree, 0);system("pause");}


原创粉丝点击