#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ADD_FOUND 0
#define ADD_ALLOC_FAILED 1
#define ADD_ROOT 2
#define ADD_NORMAL 3
#define ADD_RLNULL 4
#define ADD_LRNULL 5
#define DEL_LLNULL 6
#define DEL_LRNULL 7
#define DEL_RRNULL 8
#define DEL_RLNULL 9
#define DEL_NOTFOUND 10
#define DEL_ROOT 11
#define DEL_NORMAL 12
#define ADD_PARAERROR 13
#define DEL_PARAERROR 14
#define DEL_LCHILDNULL 15
#define DEL_RCHILDNULL 16
typedef struct _avl_node{
struct _avl_node *lchild;
struct _avl_node *rchild;
struct _avl_node *parent;
int value;
int bf;
}avl_node;
avl_node *avl_root = ;
static inline void rotate_left(avl_node *node){
avl_node *rnode;
avl_node *pnode;
if (!node || !node->rchild)return;
rnode = node->rchild;
pnode = node->parent;
if (pnode){
if (pnode->lchild == node)pnode->lchild = rnode;
else if (pnode->rchild == node)pnode->rchild = rnode;
}
else{
avl_root = rnode;
}
rnode->parent = pnode;
node->rchild = rnode->lchild;
node->parent = rnode;
if (rnode->lchild)rnode->lchild->parent = node;
rnode->lchild = node;
}
static inline void rotate_right(avl_node *node){
avl_node *lnode;
avl_node *pnode;
if (!node || !node->lchild)return;
lnode = node->lchild;
pnode = node->parent;
if (pnode){
if (pnode->lchild == node)pnode->lchild = lnode;
else if (pnode->rchild == node)pnode->rchild = lnode;
}
else{
avl_root = lnode;
}
lnode->parent = pnode;
node->lchild = lnode->rchild;
node->parent = lnode;
if (lnode->rchild)lnode->rchild->parent = node;
lnode->rchild = node;
}

static inline int add_avl_fixup(avl_node *node){
avl_node *pnode;
avl_node *child;
avl_node *tmp;
if (!node)return ADD_PARAERROR;
pnode = node->parent;
child = node;
while (pnode){
)return ADD_NORMAL;
){
if (pnode->lchild){
switch (pnode->lchild->bf)
{
:
if (pnode->lchild->lchild){
pnode->lchild->bf = ;
pnode->bf = ;
rotate_right(pnode);
 || pnode->bf <= -){
printf("ll error\n");
}
}
else{
printf("ADD_LLNULL\n");
}
break;
:
if (pnode->lchild->rchild){
){
pnode->bf = ;
pnode->lchild->bf = ;
}
){
pnode->bf = -;
pnode->lchild->bf = ;
}
){
pnode->bf = ;
pnode->lchild->bf = ;
}
pnode->lchild->rchild->bf = ;
tmp = pnode;
rotate_left(pnode->lchild);
rotate_right(tmp);
 || pnode->bf <= -){
printf("lr error\n");
}
}
else{
printf("ADD_LRNULL\n");
return ADD_LRNULL;
break;
}
}
}
else{
printf("2 not change\n");
}
return ADD_NORMAL;
}
){
if (pnode->rchild){
switch (pnode->rchild->bf)
{
:
if (pnode->rchild->rchild){
pnode->bf = ;
pnode->rchild->bf = ;
rotate_left(pnode);
||pnode->bf<=-){
printf("rr error\n");
}
}
else{
printf("ADD_RRNULL\n");
}
break;
:
if (pnode->rchild->lchild){
){
pnode->bf = ;
pnode->rchild->bf = -;
}
){
pnode->bf = ;
pnode->rchild->bf = ;
}
){
pnode->bf = ;
pnode->rchild->bf = ;
}
pnode->rchild->lchild->bf = ;
tmp = pnode;
rotate_right(pnode->rchild);
rotate_left(tmp);
 || pnode->bf <= -){
printf("rl error\n");
}
}
else {
printf("ADD_RLNULL\n");
return ADD_RLNULL;
}
break;
}
}
else{
printf("-2 not change\n");
}
return ADD_NORMAL;
}
child = pnode;
pnode = pnode->parent;
if (pnode){
 || pnode->bf == -){

}
if (pnode->lchild == child){

pnode->bf += ;

}
else if (pnode->rchild == child)
{
pnode->bf -= ;
}
}
}
}
int add_avl_node(avl_node**proot, int val,int seq){
;
avl_node *root;
avl_node *pre;
avl_node *nnode;
if (!proot)return ADD_PARAERROR;
root = *proot;
pre = root;
while (root){
pre = root;
if (root->value > val)root = root->lchild;
else if (root->value < val)root = root->rchild;
else return ADD_FOUND;
}
++counter;
nnode = (avl_node *)malloc(sizeof(avl_node));
if (!nnode)return ADD_ALLOC_FAILED;
memset(nnode, , sizeof(avl_node));
nnode->value = val;
nnode->bf = ;
nnode->parent = ;
nnode->lchild = ;
nnode->parent = ;
){
*proot = nnode;
return ADD_ROOT;
}
if (pre->value > val){
){
printf("NOT 1 %d 0x%x\n",counter,(unsigned int)pre->lchild);
}
pre->bf += ;
pre->lchild = nnode;
}
else if (pre->value < val){
){
printf("NOT -1 %d 0x%x\n",counter,(unsigned int)pre->rchild);
}
pre->bf -= ;
pre->rchild = nnode;
}
nnode->parent = pre;
return add_avl_fixup(nnode);
}
static inline int del_avl_fixup(avl_node *node){
avl_node *pnode;
avl_node *child;
if (!node)return DEL_PARAERROR;
pnode = node;
while (pnode){
){
if (!pnode->lchild){
printf("pnode->lchild is null\n");
return DEL_LCHILDNULL;
}
){
pnode->bf = ;
pnode->lchild->bf = -;
rotate_right(pnode);
return DEL_NORMAL;
}
){
pnode->bf = ;
pnode->lchild->bf = ;
child = pnode->lchild;
rotate_right(pnode);
pnode = child;
}
){
if (pnode->lchild->rchild){
){
pnode->lchild->bf = ;
pnode->bf = -;
}
){
pnode->lchild->bf = ;
pnode->bf = ;
}
){
pnode->lchild->bf = ;
pnode->bf = ;
}
pnode->lchild->rchild->bf = ;
child = pnode->lchild->rchild;
rotate_left(pnode->lchild);
rotate_right(pnode);
pnode = child;
}
else {
printf("DEL LR NULL\n");
return DEL_LRNULL;
}
}
}
){
if (!pnode->rchild){
printf("pnode->rchild is null\n");
return DEL_RCHILDNULL;
}

){
pnode->bf = -;
pnode->rchild->bf = ;
rotate_left(pnode);
return DEL_NORMAL;
}
){
if (pnode->rchild->lchild){
){
pnode->bf = ;
pnode->rchild->bf = -;
}
){
pnode->bf = ;
pnode->rchild->bf = ;
}
){
pnode->bf = ;
pnode->rchild->bf = ;
}
pnode->rchild->lchild->bf = ;
child = pnode->rchild->lchild;
rotate_right(pnode->rchild);
rotate_left(pnode);
pnode = child;
}
else{
printf("DEL RL NULL\n");
return DEL_RLNULL;
}
}
){
pnode->bf = ;
pnode->rchild->bf = ;
child = pnode->rchild;
rotate_left(pnode);
pnode = child;
}
}
 || pnode->bf == ){
return DEL_NORMAL;
}
 || pnode->bf < -){
printf("DEL INVALID bf %d\n", pnode->bf);
}
if (pnode->parent){
;
;
}
pnode = pnode->parent;
}
return DEL_NORMAL;
}
int del_avl_node(avl_node **proot,int val){
avl_node *root;
avl_node *post;
avl_node *pnode=;
if (!proot||!(*proot))return DEL_PARAERROR;
root = *proot;
while (root){
if (root->value > val)root = root->lchild;
else if (root->value < val)root = root->rchild;
else break;
}
if (!root)return DEL_NOTFOUND;
if (!root->lchild){
if (root->parent){
if (root->parent->lchild == root){
root->parent->bf -= ;
if (root->rchild)root->rchild->parent = root->parent;
root->parent->lchild = root->rchild;
}
else if (root->parent->rchild == root){
root->parent->bf += ;
if (root->rchild)root->rchild->parent = root->parent;
root->parent->rchild = root->rchild;
}
pnode = root->parent;
memset(root, , sizeof(avl_node));
free(root);
}
else{
;
*proot = root->rchild;
printf("L NULL P NULL\n");
memset(root, , sizeof(avl_node));
free(root);
return DEL_NORMAL;
}
}
else if (!root->rchild){
if (root->parent){
if (root->parent->lchild == root){
root->parent->bf -= ;
if (root->lchild)root->lchild->parent = root->parent;
root->parent->lchild = root->lchild;
}
else if (root->parent->rchild == root){
root->parent->bf += ;
if (root->lchild)root->lchild->parent = root->parent;
root->parent->rchild = root->lchild;
}
pnode = root->parent;
memset(root, , sizeof(avl_node));
free(root);
}
else{
;
*proot = root->rchild;
printf("R NULL P NULL\n");
memset(root, , sizeof(avl_node));
free(root);
return DEL_NORMAL;
}
}
else{
post = root->rchild;
while (post->lchild)post = post->lchild;
root->value = post->value;
if (post->parent->lchild==post){
post->parent->bf -= ;
post->parent->lchild = post->rchild;
if (post->rchild){
post->rchild->parent = post->parent;
}
}
else if (post->parent->rchild == post){
post->parent->bf += ;
post->parent->rchild = post->rchild;
if (post->rchild){
post->rchild->parent = post->parent;
}
}
pnode = post->parent;
memset(post, , sizeof(avl_node));
free(post);
}
return del_avl_fixup(pnode);
}
static void cal_avl_deepth(avl_node *root,int *total,int *deepth){
;
;
avl_node *post;
];
FILE *fp;
if (!root)return;
deepth[] = ;
memset(buf, , sizeof(buf));
sprintf(buf, ));
){
printf("Failed to open file\n");
return;
}
while (root){
){
root = root->lchild;
deepth[]++;
}
])last_deepth = deepth[];
)printf(]);
total[]++;
fprintf(fp, "%d ", root->value);
if (!root->rchild){
while (root->parent&&root->parent->rchild == root){
root = root->parent;
deepth[]--;
}
deepth[]--;
root = root->parent;
flag = ;
}
else{
deepth[]++;
root = root->rchild;
flag = ;
}
}
deepth[] = last_deepth;
fclose(fp);
}

int main(void){
;
;
;
srand(time());
; i < ;i++){
add_avl_node(&avl_root, rand()%0x7fffffff,i);
del_avl_node(&avl_root, rand() % 0x7fffffff);
}
cal_avl_deepth(avl_root, &total_avl_node, &avl_deepth);
printf("total:%d deepth:%d\n", total_avl_node, avl_deepth);
; i < 0x7fffffff; i++){
del_avl_node(&avl_root, i);
}
total_avl_node = ;
avl_deepth = ;
cal_avl_deepth(avl_root, &total_avl_node, &avl_deepth);
printf("total:%d deepth:%d\n", total_avl_node, avl_deepth);
){

}
;
}

AVL树,C语言实现,完整代码,先贴上,讲解稍后的更多相关文章

  1. AVL树(一)之 图文解析 和 C语言的实现

    概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...

  2. AVL树(三)之 Java的实现

    概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...

  3. AVL树之 Java的实现

    AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...

  4. 平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树

    平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树 (a)和(b)都是排序二叉树,但是查找(b)的93节点就需要查找6次,查找(a)的93 ...

  5. AVL树(平衡二叉查找树)

    首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树 ...

  6. linux 内核数据结构之 avl树.

    转载: http://blog.csdn.net/programmingring/article/details/37969745 https://zh.wikipedia.org/wiki/AVL% ...

  7. AVL树原理及实现(C语言实现以及Java语言实现)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...

  8. AVL树(查找、插入、删除)——C语言

    AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...

  9. 深入浅出数据结构C语言版(12)——平衡二叉查找树之AVL树

    在上一篇博文中我们提到了,如果对普通二叉查找树进行随机的插入.删除,很可能导致树的严重不平衡 所以这一次,我们就来介绍一种最老的.可以实现左右子树"平衡效果"的树(或者说算法),即 ...

  10. 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)

    上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...

随机推荐

  1. 【刷题笔记】686. Repeated String Match

    题意 题目大意是,给两个字符串 A 和 B,问 B 是否能成为 A+A+A+...+A 的子字符串,如果能的话,那么最少需要多少个 A? 暴力解法 直接 A+A+...,到哪次 A 包含 B 了,就返 ...

  2. 公司redis

    一: redis cluster介绍篇 1:redis cluster的现状 目前redis支持的cluster特性(已亲测): 1):节点自动发现 2):slave->master 选举,集群 ...

  3. Ptyhon 合并列表

    2019-08-25 list1 =  [91, 95, 97, 99] list2 =  [92, 93, 96, 98] 合并后得到:[91, 95, 97, 99 , 92, 93, 96, 9 ...

  4. SSOJ 317 Fast Ride

    317. Fast Ride Time limit per test: 0.25  second(s) Memory limit: 65536 kilobytes input: standard ou ...

  5. 在$CF$水题の记录

    CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...

  6. docker--数据持久化之Data Volume

    使用mysql为例 查看docker hub官方的mysql image 的dockerfile,有这一行:VOLUME /var/lib/mysql -v给volume创建别名 [root@loca ...

  7. Skimap_ros 利用RGBD创建Octomap(一)

    1. 奥比中光astra RGBD相机安装 1.1 安装依赖 $ sudo apt-get install build-essential freeglut3 freeglut3-dev 1.2 检查 ...

  8. The Complete Javascript Number Reference 转载自:http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference

    The Complete Javascript Number Reference Filed: Mon, Apr 30 2007 under Programming|| Tags: reference ...

  9. 任正非:5G技术只独家卖给美国!不卖给韩国、日本、欧洲

    https://v.qq.com/x/page/g3001d0xvxe.html 我只转个标题,细节不管了. 呃,实际上就是说,老任头也决定向美国低头了,对不. 不过,也确实没办法. 该起床吃钙片了.

  10. C# 编程--数组

    数组 可以帮我我们一次声明存储多个相同类型的变量.用来解决同一类大量数据在内存存储和运算的功能特点:连续.同一类数据数组定义==>赋值==>取值    定义:        int[] n ...