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");}
阅读全文
1 0
- C语言 AVL树的 非递归 方法插入
- AVL树插入例程非递归实现C语言
- AVL平衡树插入非递归实现 C语言
- 向AVL树进行插入的非递归函数
- AVL树进行插入的非递归函数
- AVL树的基本操作之插入(递归与非递归编码)(2)
- AVL平衡树及插入操作的C语言实现
- AVL树的插入、删除及遍历C语言实现
- AVL树非递归实现插入和删除例程
- C语言二叉树的遍历,递归和非递归
- 【c++】二叉搜索树的插入、查找、非递归删除
- AVL树的插入与删除(均为递归实现)
- AVL平衡树递归删除实现 C语言
- C语言树形输出AVL树28个随机数的插入过程
- 纯C语言实现的AVL树(插入&删除&前序遍历输出)
- 二叉树遍历的c语言非递归实现
- 二叉树的遍历(c语言非递归算法)
- 二叉树的非递归遍历C语言实现
- C#DSN操作
- 一维数组交换
- 剑指Offer--16.合并两个排序的链表
- CNTK API文档翻译(23)——使用CTC标准训练声学模型
- 让shell脚本中的echo输出带颜色
- C语言 AVL树的 非递归 方法插入
- POJ
- ASP.Net
- ASP防SQL注入攻击程序
- 第三周项目1顺序表的基本运算
- 游戏 飞机大战 c++
- js中获取浏览器可视窗口大小
- 需求分析师应具备的几项能力
- 常见版本管理工具