数据结构(七)——查找之平衡二叉树

代码中所用到的结构体

typedef struct node
{
   
    int key;//关键字
    struct node*left;
    struct node*right;
    int height;//当前结点所在的高度
}BTNode;

构造平衡二叉树算法的主要思想

为了提高查找的效率,于是在二叉排序树的基础上,有了二叉平衡树的诞生。其中,先介绍几个重要的概念:

  • 平衡因子(BF):任一结点的左子树的高度减去右子树的高度所得的高度差称为该结点的平衡因子BF
  • AVL树:它的左子树和右子树都是AVL树; 且左子树和右子树的高度之差的绝对值不超过1。

重要性质:

  • 一棵平衡二叉排序树如果有n个结点,其高度可保持在O(log2n),平均查找长度也可保持在O(log2n)

算法思想

  • 通过递归的方法,来对二叉树进行构造,在BF值为正常值(即-1,0,1)的情况下,不对该二叉树进行特殊操作。
  • 由于是使用递归的算法。故BF值得计算是从下往上计算,计算方法为当前结点的左儿子高度减去右儿子高度。
  • 再通过插入关键值和BF值不正常结点的比较来决定进行哪种旋转

创建新结点

BTNode* newNode(int key)//初始化新的结点
{
   
    BTNode *N = (BTNode*)malloc(sizeof(BTNode));
    N->key = key;
    N->left = NULL;
    N->right = NULL;
    N->height = 1;
    return N;
}

当插入点在BF值异常点的左子树的左子树上

简称为左左插入,此时执行的是顺时针旋转

BTNode* LL_rotate(BTNode* y)//左左插入(顺旋转)
{
   
    BTNode* x = y->left;//申请一个新的结构指针指向y的左结点
    y->left = x->right;
    x->right = y;
    x->height = max(height(x->left),height(x->right));//对其高度进行更新
    y->height = max(height(y->left),height(y->right));
    return x;//返回根节点
}

当插入点在BF值异常点的右子树的右子树上

简称为右右插入,此时执行的是逆时针旋转

BTNode* RR_rotate(BTNode* y)//右右插入(逆旋转)
{
   
    BTNode* x = y->right;
    y->right = x->left;
    x->left = y;
    x->height = max(height(x->left),height(x->right));//对其高度进行更新
    y->height = max(height(y->left),height(y->right));
    return x;
}

当插入点在BF值异常点的左子树的右子树上

简称为左右插入,此时执行的是逆顺时针旋转,这个时候就调用一次逆旋转再调用一次顺旋转即可。

BTNode* LR_rotate(BTNode* y)//左右插入(逆顺旋转)
{
   
    y->left = RR_rotate(y
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值