AVL树的调整(笔记)

1.定义

二叉树:二叉树是每个结点最多有两个子树的树结构。
二叉搜索树:二叉搜索树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树:

  •  若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树。

平衡二叉搜索树:平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,且具有以下性质:

  • 它是一 棵空树
  • 或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

2.平衡二叉搜索树的基本操作:

  • 插入元素:需要调整(左单旋,右单旋,左右单旋,右左单旋)以维持树的平衡
  • 查找元素
  • 删除元素

3.错误报告:

  • 在进行左单旋时,应该先将B的右子树分给A的左子树,否则会造成A的左子树是A的死循环(右单旋同理)
  • 在进行插入操作后,一点要更新树的高度
  • 对于指针为NULL一定要细心处理,切勿遗忘

4.代码示例:

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
typedef struct AVLNode *position;
typedef position AVLTree;
struct AVLNode{
    int data;
    AVLTree left;
    AVLTree right;
    int h;
};
int GetHight(AVLTree A){
    if(A == NULL)    return -1;
    return A->h;
}
//左单旋
AVLTree SLR(AVLTree A){
    AVLTree B = A->left;
    A->left = B->right;
    B->right = A;
    A->h = max(GetHight(A->left),GetHight(A->right))+1;
    B->h = max(GetHight(B->left),GetHight(B->right))+1;
    return B;

//右单旋
AVLTree SRR(AVLTree A){
    AVLTree B = A->right;
    A-> right = B->left;
    B->left = A;
    A->h = max(GetHight(A->left),GetHight(A->right))+1;
    B->h = max(GetHight(B->left),GetHight(B->right))+1;
    return B;
}
//左右双旋
AVLTree DLRR(AVLTree A){
    AVLTree B = A->left;
    A->left = SRR(B);
    return SLR(A);
}
//右左双旋 
AVLTree DRLR(AVLTree A){
    AVLTree B = A->right;
    A->right = SLR(B);
    return SRR(A);
}
AVLTree Insert(AVLTree T,int x){
    if(T == NULL){
        T = new AVLNode();
        T->data = x;
        T->left = NULL;
        T->right = NULL;
        T->h = 0;
    }else if(x < T->data){
        T->left = Insert(T->left,x);
        if(GetHight(T->left) - GetHight(T->right) == 2)
            if(x < T->left->data)    T = SLR(T);
            else T = DLRR(T);
    }else if(x > T->data){
        T->right = Insert(T->right,x);
        if(GetHight(T->left)-GetHight(T->right) == -2)
            if(x > T->right->data)    T = SRR(T);
            else    T = DRLR(T);
    }
    T->h = max(GetHight(T->left),GetHight(T->right))+1;
    return T;
}
原文:https://blog.csdn.net/weixin_41162823/article/details/82466517 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值