AVL平衡树递归删除实现 C语言
2016-09-23 21:34
267 查看
接上一篇插入之后,又折腾写了AVL递归删除例程,主要难点在于删除后保证路径上的节点高度值有效。思路已在例程中说明参考了http://www.cnblogs.com/skywang12345/p/3576969.html,该文章中的删除例程未考虑删除之后恢复高度值,导致删除节点后失衡。后又参考了http://www.cppblog.com/cxiaojia/archive/2015/07/20/187776.html,该文章为C++实现。
AvlTree Delete(int X, AvlTree T) { if (NULL == T) { return T; } if (X < T->Element) { T->Left = Delete(X, T->Left); /** 若失衡,调整平衡 */ if (Height(T->Right) - Height(T->Left) == 2) { Position P = T->Right; if (Height(P->Left) <= Height(P->Right)) { T = SingleRotateWithRight(T); } else { T = DoubleRotateWithRight(T); } } } else if (X > T->Element) { T->Right = Delete(X, T->Right); /** 若失衡,调整平衡 */ if (Height(T->Left)-Height(T->Right) == 2) { Position P = T->Left; if (Height(P->Left) <= Height(P->Right)) { T = SingleRotateWithLeft(T); } else { T = DoubleRotateWithLeft(T); } } } else //X == T->Element { /** * 1. 左右子树均不为空: * 若左子树较高 * (1)替换节点element为左子树最大节点element * (2)循环删除最大节点 * 若右子树较高或等高 * (1)替换节点element为右子树最小节点element * (2)循环删除最小节点 * 2. 左右子树至少有一个为空 * 若左子树为空 * (1)删除当前节点并返回右子树 * 若右子树为空 * (2)删除当前节点并返回左子树 */ if ((NULL != T->Left) && (NULL != T->Right)) { if (Height(T->Left) > Height(T->Right)) { AvlTree maxNode = FindMax(T->Left); T->Element = maxNode->Element; T->Left = Delete(maxNode->Element, T->Left); } else { AvlTree minNode = FindMin(T->Right); T->Element = minNode->Element; T->Right = Delete(minNode->Element, T->Right); } } else { AvlTree tmp = T; T = NULL != T->Left ? T->Left : T->Right; free(tmp); } } /** 高度值需在上一级修改 */ if (NULL != T) { T->Height = MAX(Height(T->Left), Height(T->Right)) + 1; } return T; }
相关文章推荐
- C语言实现递归删除文件夹及文件
- C语言实现递归删除文件夹
- AVL平衡树插入非递归实现 C语言
- C语言:用递归实现将输入的整数按逆序输出。如输入12345,则输出54321。
- 八皇后 C语言递归实现
- 归并排序递归实现C语言
- C语言的快速排序算法代码-递归实现
- 一个C语言实现不含递归的高效快速排序算法
- 字符串的删除,递归实现
- 删除C/C++中的注释-有限状态机(C语言实现)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- C语言实现从字符串中删除*
- c语言递归实现的通配符搜索
- 经典的农夫养牛题目,C语言,递归实现
- 二分查找法的C语言实现:递归与循环
- C语言链表基本函数的递归实现
- 前导零(空格)删除(非全数字),类静态方法递归实现
- C语言单链表的建立,查找,添加,删除,修改功能实现
- C语言递归和非递归实现字符串反转函数char *reverse(char *str)
- 迷宫问题--非递归回溯 C语言实现