AVL树,C语言实现,完整代码,先贴上,讲解稍后
#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语言实现,完整代码,先贴上,讲解稍后的更多相关文章
- AVL树(一)之 图文解析 和 C语言的实现
概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...
- AVL树(三)之 Java的实现
概要 前面分别介绍了AVL树"C语言版本"和"C++版本",本章介绍AVL树的Java实现版本,它的算法与C语言和C++版本一样.内容包括:1. AVL树的介绍 ...
- AVL树之 Java的实现
AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...
- 平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树
平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树 (a)和(b)都是排序二叉树,但是查找(b)的93节点就需要查找6次,查找(a)的93 ...
- AVL树(平衡二叉查找树)
首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树 ...
- linux 内核数据结构之 avl树.
转载: http://blog.csdn.net/programmingring/article/details/37969745 https://zh.wikipedia.org/wiki/AVL% ...
- AVL树原理及实现(C语言实现以及Java语言实现)
欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...
- AVL树(查找、插入、删除)——C语言
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...
- 深入浅出数据结构C语言版(12)——平衡二叉查找树之AVL树
在上一篇博文中我们提到了,如果对普通二叉查找树进行随机的插入.删除,很可能导致树的严重不平衡 所以这一次,我们就来介绍一种最老的.可以实现左右子树"平衡效果"的树(或者说算法),即 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)
上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...
随机推荐
- CATiledLayer显示超大图片的解决方案
先对图片进行了裁剪 -> 很多小图片, 然后再根据显示 进行绘制 - (void)viewDidLoad { [super viewDidLoad]; [self cutImageAndSave ...
- javascript: 禁用右键、文本选择功能、复制按键
<script type="text/javascript"> //禁用右键.文本选择功能.复制按键 //http://www.jinyuanbao.cn $(docu ...
- create Excel file - snippet
http://www.codepal.co.uk/show/Line_breaks_lost_and_br_tags_show_when_exporting_to_Excel_file Protec ...
- 分别用switch语句和if语句实现键盘录入月份,输出对应的季节
switch建议判断固定值的时候用 if建议判断区间或范围的时候用 1.用switch实现键盘录入月份,输出对应的季节 import java.util.Scanner; class Hello2 { ...
- js的this、bind、call、apply个人领悟
this 1.非箭头函数: 如果是该函数是一个构造函数,this指针指向一个新的对象 在严格模式下的函数调用下,this指向undefined 如果是该函数是一个对象的方法,则它的this指针指向这个 ...
- Python基础篇(初始函数)
Python初始函数: 一.什么是函数 1.我们到目前为止, 已经可以完成一些软件的基础功能了. 那么我们来完成这样一个功 能: 约x: print("拿出手机") print(& ...
- Java8 LocalDate操作时间和日期的API
时间项目中的涉及到的时间处理非常多,犹豫SimpleDateFormat的不安全性以及Calendar等类在计算时比较复杂, 往往我们都会使用工具类来封装较多的日期处理函数, 但是JDK8中新增了操作 ...
- 小程序中为什么使用var that=this
前言: 在小程序或者js开发中,经常需要使用var that = this;开始我以为是无用功,(原谅我的无知),后来从面向对象的角度一想就明白了,下面简单解释一下我自己的理解,欢迎指正批评. 代码示 ...
- 看不懂源码?先来恶补一波Object原型吧
目录 Object Object属性 1.Object.prototype 2.Object.name Object方法 1.Object.assign() 2.Object.create() 3.O ...
- Nginx Web 基础入门
目录 Nginx Web 基础入门 Nginx快速安装 两种方式部署Nginx 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 虚拟 ...