平衡二叉树(AVL)的实现(详细) c++ 二叉排序树

本文详细介绍了平衡二叉树的概念,包括其性质、平衡因子、四种旋转调整方法(LL、RR、LR、RL)以及创建平衡二叉树的步骤。通过示例展示了如何在插入节点后保持树的平衡,以确保高效的查找性能。同时提供了完整的C++代码实现。

平衡二叉树概念

平衡二叉排序树(Balanced Binary Tree),因由前苏联数学家Adelson-Velskii 和
Landis于1962年首先提出的,所以又称为AVL树。

平衡二叉树是一种特殊的二叉排序树,理解平衡二叉树首先要理解什么是二叉排序树。
如果已经了解二叉排序树可以直接看下面平衡二叉树内容。

二叉排序树(Binary Sort Tree)

所谓二叉排序树(BST)即:
(1)若该树的子树不为空,那么子树所以结点的值均于其根结点的值。
(2)若该树的子树不为空,那么子树所以结点的值均于其根结点的值。
(3)该树的左右子树也均为二叉排序树。
依此定义,我们可以通过比较根结点的值一层层地定位到所要查找的值。

例:如下图是一棵二叉排序树
图来源于网络
比如我们要查找7,那么先从根结点开始比较,8>7查找左子树 ----> 3<7查找右子树 ----> 6>7查找右子树 ----> 最后7=7,找到了7。
这种查找算法与折半查找相似,也是逐步缩小搜索范围。
若中序遍历上图,则可以得到一个按数值大小排序的递增序列:1,3,4,6,7,8,10,13,15。

一、二叉排序树的储存结构
typedef struct BSTNode
{
   
   
	int data=0;//数据项
	struct BSTNode *lchild=NULL,*rchild=NULL;//左右子树
}BSTNode,*BSTree.
二、二叉排序树的查找算法(递归查找)

BSTree T 为二叉树根节点 ,int e 为查找的关键字。时间复制度为O(log2 n)。

int searchTree(BSTree T,int e)//在二叉树中查找给定关键字(函数返回值为成功1,失败0)
{
   
   
    if (T==NULL)//无法查找到给定关键字
    {
   
   
        return 0;
    }else if (e==T->data)//查找到关键字
    {
   
   
        return 1;
    }else if (e<T->data)//小于根结点,向左子树查找
    {
   
   
        return searchTree(T->lchild,e);
    }else if(e>T->data)//大于根结点,向右子树查找
    {
   
   
        return searchTree(T->rchild,e);
    }
}
三、二叉排序树的创建及插入(递归)

二叉排序树的插入算法基本过程也是查找,时间复制度也为O(log2 n)。
图片来源于网络

void InsertBST(BSTree &T,int e)//插入节点,根据节点值的大小插入
{
   
   //当二叉排序树中不存在关键字等于e的结点时,查找结束,插入结点
    if (!T)//查找到插入位置
    {
   
   
        BSTNode *S; //生成新结点
        S=new BSTNode;
        S->data=e;//给新结点赋值
        S->lchild=S->rchild=NULL;//将新结点作为叶子结点
        T=S;//给查找到的插入位置赋值
    }
    else if (e<T->data)
    {
   
   
        InsertBST(T->lchild,e);//向左查找插入
    }else if (e>T->data)
    {
   
   
        InsertBST(T->rchild,e);//向右查找插入
    }
}
void CreatBST(BSTree &T)//创建二叉树
{
   
   
    T=NULL;
    int e,n,i;
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
   
   
        scanf("%d",&e);
        InsertBST(T,e);
    }
}

平衡二叉树

介绍完二叉排序树,我们就来看看平衡二叉树。
平衡二叉树就是在二叉排序树上建立的,可以说是具有以下两个特征的二叉排序树:
(1)左子树和右子树的深度之差的绝对值不超过1。
(2)左子树和右子树也是平衡二叉树。

平衡因子

为了方便记录和计算左右子树深度之差,我们引入一个概念叫平衡因子。
平衡因子就是该结点左右子树深度之差,由平衡二叉树的定义我们可以知道平衡二叉树上的平衡因子只可能是-1,0,1 。
图片来源于网络

二叉排序树的储存结构
typedef struct AVLNode
{
   
   
    int data=0;//结点值
    int depth=0;//深度,方便通过计算左右子树深度之差得到该结点的平衡因子
    struct AVLNode *father=NULL;//父结点
    struct AVLNode *lchild=NULL,*rchild=NULL;//左右结点
} AVLNode,*AVLTree; //结点结构体

计算平衡因子代码实现:

int count_depth(AVLTree &T)//计算各结点的深度
{
   
   
    if(T==NULL)
    {
   
   
        return 0;
    }
    else
    {
   
   
        int l=count_depth(T->lchild);//左子树深度
        int r=count_depth(T->rchild);//右子树深度
        return T->depth=max(l,r)+1;//更新深度
    }
}

int get_balance
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值