数据结构:AVL平衡树(c版本)

AVL树是一种平衡二叉查找树,通过旋转操作保持左右子树高度差不超过1,从而确保高效的查找效率。文章介绍了AVL树的基本概念,插入节点后的旋转调整,包括单左旋、单右旋、左右旋、右左旋四种情况,并提供了avl_tree.h和avl_tree.c的源码示例。此外,还展示了中序遍历、先序遍历和后序遍历的实现,以帮助理解AVL树的结构和操作。
摘要由CSDN通过智能技术生成

AVL树呢,是平衡树中一个非常经典的例子。因为普通的查找树在插入和删除的过程有可能会产生树的一端子树高度比另一边大很多的情况,也就是所谓的退化为链表(查找是一个一个节点去找),降低了查找的效率。

AVL平衡树通过一系列旋转的方式让左子树和右子树的高度相差不大(<=1),这样搜索的效率将会维持在较好的水平。

方法就是当插入一个节点之后,
更新父节点的高度,判断父节点的左右子树高度差是否为2,若是,进行相应旋转操作(4种)来降低左右子树高度差。若不是,判断父节点的父的左右子树高度差是否为2,以此类推,直到根节点(当然是递归中完成)。

单左旋,单右旋,左右旋,右左旋就是将3个节点间调整次序来,代码如下,具体样子就不画图了,在这些点调节次序的过程中,我们可以发现搜索树节点大小顺序还是正常排列的。
也就是中序遍历的结果还是1234567这样从小到大排列。
avl_tree.h

#ifndef _Avltree_h
#define _Avltree_h
#define Max(a,b) ((a)>(b)?(a):(b))

struct AvlNode;
typedef struct AvlNode*Position;
typedef struct AvlNode*AvlTree;
typedef int ElementType ;
Position    Find(ElementType X,AvlTree T);
Position    FindMin(AvlTree T);
Position    FindMax(AvlTree T);
AvlTree MakeEmpty(AvlTree T);
AvlTree Insert(ElementType X,AvlTree T);
void InOrder_2(AvlTree T,int depth);
int  PostOrder_2(AvlTree T,int depth);
void PreOrder_2(AvlTree T,int depth);
void PreOrder(AvlTree T);
void InOrder(AvlTree T);
void PostOrder(AvlTree T);
struct AvlNode
{
   
    ElementType Element;
    AvlTree Left;
    AvlTree Right;
    int Height;
};
#endif


avl_tree.c

#include<stdio.h>
#include<stdlib.h>
#include"avl_tree.h"
static  Position    SingleRotateWithLeft(Position K2);
static  Position    DoubleRotateWithLeft(Position   K3);
static  Position    SingleRotateWithRight(Position K2);
static  Position    DoubleRotateWithRight(Position   K3);
static int Height (Position P);
static  Position    SingleRotateWithLeft(Position K2)
{
   
    // puts("右旋");

    Position    K1;
    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;
}
static  Position    DoubleRotateWithLeft(Position   K3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>