AVL平衡树的插入例程
2014-05-31 07:48
274 查看
/*
**AVL平衡树插入例程
**2014-5-30 11:44:50
*/
avlTree insert(elementType X, avlTree T){
if(T == NULL){
T = malloc(sizeof(struct avlTree));
if(T == NULL) fatalError("Out of space!!!");
T->element = X; T->height = 0;
T->left = T->right = NULL;
}else if(X < T->element){
T->left = insert(X, T->left);
if(height(T->left) - height(T->right) == 2){
if(X < T->left->element)
T = singleRotateWithLeft(T);
else T = doubleRotateWithLeft(T);
}
}else if(X > T->element){
T->right = insert(X, T->right);
if(height(T->right) - height(T->left) == 2){
if(X > T->right->element)
T = singleRotateWithRight(T);
else T = doubleRotateWithRight(T);
}
}
/*--如果X已经存在,那么啥都不用做--*/
T->height = max(height(T->left), height(T->right)) + 1;
return T;
}
static position singleRotateWithLeft(position k2){
position k1 = k2-> left;
k2->left = k1->right;
k1->right = k2;
k2->height = max(height(k2->left), height(k2->right)) + 1;
k1->height = max(height(k1->left), k2->height) + 1;
return k1;
}
/*双右左旋就是先对T的右子树左单旋再对T本身右单旋*/
static position
**AVL平衡树插入例程
**2014-5-30 11:44:50
*/
avlTree insert(elementType X, avlTree T){
if(T == NULL){
T = malloc(sizeof(struct avlTree));
if(T == NULL) fatalError("Out of space!!!");
T->element = X; T->height = 0;
T->left = T->right = NULL;
}else if(X < T->element){
T->left = insert(X, T->left);
if(height(T->left) - height(T->right) == 2){
if(X < T->left->element)
T = singleRotateWithLeft(T);
else T = doubleRotateWithLeft(T);
}
}else if(X > T->element){
T->right = insert(X, T->right);
if(height(T->right) - height(T->left) == 2){
if(X > T->right->element)
T = singleRotateWithRight(T);
else T = doubleRotateWithRight(T);
}
}
/*--如果X已经存在,那么啥都不用做--*/
T->height = max(height(T->left), height(T->right)) + 1;
return T;
}
static position singleRotateWithLeft(position k2){
position k1 = k2-> left;
k2->left = k1->right;
k1->right = k2;
k2->height = max(height(k2->left), height(k2->right)) + 1;
k1->height = max(height(k1->left), k2->height) + 1;
return k1;
}
/*双右左旋就是先对T的右子树左单旋再对T本身右单旋*/
static position
相关文章推荐
- AVL平衡树的插入例程
- AVL平衡树及插入操作的C语言实现
- visual c++ 2015 使用ado.net例程, 向数据库表插入一行并查询行数。
- B树的基本例程(1)插入
- 运行Delphi XE10的MongoDB例程,测试Delphi插入记录性能
- AVL树非递归实现插入和删除例程
- C语言及程序设计进阶例程-18 链表中结点的插入和删除
- 第15周 数据结构例程——插入排序之直接插入排序
- AVL平衡树插入非递归实现 C语言
- WebBrowser例程 - 插入HTML和执行脚本的方法
- python sqlite3 插入数据例程
- 中序线索树插入例程(自调整前驱后缀指针)C语言
- C++语言基础 例程 重载流插入运算符和流提取运算符
- AVL树插入例程非递归实现C语言
- 数据结构例程——插入排序之直接插入排序
- 数据结构例程——插入排序之希尔排序
- 二叉堆的插入例程
- 将一张表的查询结果插入到另一张表
- mysql循环嵌套插入数据的问题
- opencv学习之路(2)--(测试例程)