AVL树构建代码及其基本操作

本文介绍了AVL树的基本概念,强调了其作为二叉平衡树的特性。通过节点结构体定义和主程序讲解,阐述了AVL树的构建过程,特别是插入节点时如何保持平衡。同时,提到了查找、删除和中序遍历等操作,并分享了作者在理解他人代码基础上简化后的实现,旨在帮助读者更好地理解AVL树的工作原理。
摘要由CSDN通过智能技术生成

参考了很多代码后自己的总结.个人感觉AVL树的代码比huffman树的代码更难理解,有些地方刚开始看的时候觉得疑惑,为什么网络上的讲解能那么肯定就是那样,后来自己画了很多二叉树后发现,确实就是那样,所以就干脆把某些东西当规律记下来了。-_-发个无语的小表情
一.简单的AVL树自我理解
二叉平衡树呀,就是说每个节点的左子树和右子树的高度差最多为1,一个节点没有左右子树,高度为0,然后每有一层高度加1,空树的高度在这里设定为-1.
二.avl树节点结构体定义

typedef struct AVL_Node
{
    int data; //数据
    int height;//节点高度 
    struct AVL_Node *llink;
    struct AVL_Node *rlink;
}Node;
typedef Node* PNode;

三.主程序讲解

void main()
{
    PNode root = NULL;
    Insert(&root,3);
    Insert(&root,2);
    Insert(&root,1);
    Insert(&root,4);
    Insert(&root,5);
    Insert(&root,6);
    Insert(&root,7);
    Insert(&root,10);
    Insert(&root,9);
    Insert(&root,8);
    Inoreder(root);
    printf("\n");
    printf("查找节点7\n");
    search(root,7);
    printf("删除节点10\n");
    Delete(&root,10);
    search(root,9);
    Inoreder(root);
}

接着看一下两个辅助函数

int NodeHeight(PNode*  ptrTree)  //返回节点高度
{  
    return (*ptrTree)==NULL ? -1 :(*ptrTree)->height;  
} 

int Max(int a,int b)//返回最大值
{
    return a>b ? a : b;
}

AVL树的构建是通过插入节点实现的,并且在插入的过程中逐渐调整节点高度,最终生成二叉平衡树。为什么不用递归实现建立呢,那样的话就是我们事先画好一颗平衡二叉树,然后按顺序输入了,这就没有意义了。我们的目的就是让程序帮我们把输入的节点改造成平衡二叉树。
看一下Inoreder插入代码

int Insert(PNode *node,int x)
{
    if((*node)==NULL)//节点为空插入这里
    {
        (*node) = (PNode)malloc(sizeof(Node));
        (*node)->data = x;
        (*node)->llink = NULL;
        (*node)->rlink = NULL;
        (*node)->height = 0;
        return 1;
    }
    else if(x == (*node)->data)//原来存在该节点返回0,递归结束
    {
        return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值