AVL树(平衡二叉树)的构造

AVL树是一种平衡二叉树,确保任意节点的左右子树高度差不超过1,从而保持插入、查找、删除操作的时间复杂度为O(logN)。当操作导致不平衡时,通过左旋、右旋进行调整。本文介绍了四种不平衡状态(左左、左右、右左、右右)及对应的旋转策略,包括旋转的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特点:平衡二叉树要求对于每一个节点来说,他的左右子树的高度之差不超过1,如果插入或者删除一个结点使得高度之差大于1,就要进行节点之间的旋转(左旋或者右旋),将二叉树重新维持在一个平衡状态
解决了二叉查找树退化成链表的问题,把插入,查找,删除时间复杂度最坏和最好情况都维持在O(logN)
旋转缺点:频繁旋转会牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了许多。

平衡二叉树的核心:
旋转算法
这里写图片描述
1:左左形式的不平衡
2.左右形式的不平衡
3.右左形式的不平衡
4.右右形式的不平衡
1,4一组
2,3一组

对于1:左旋 3的右子树给6的左边,6变成3的右子树,3成根
确定要换的根root和左子树left,left的右子树给root的左,root变成left的右
对于4:右旋 4的左子树给2的右边,2变成4的左子树,2成根
确定要换的根root和右子树right,right的左子树给root的右然后root变成right的左
对于2:先右旋左子树,再左旋根
这里写图片描述
对于3:先左旋右子书,再右旋根
代码如下:

#include <iostream>
#include <malloc.h>
#include <stack>

using namespace std;

typedef struct TreeNode
{
    int height;
    int data;
    TreeNode* leftC;
    TreeNode* rightC;
}TreeNode;

int getHeight(TreeNode* s)
{
    if (s != NULL)
    {
        return s->height;
    }
    return -1;
}

void InitTree(TreeNode** list)
{
    *list = (TreeNode*)malloc(sizeof(TreeNode));
    (*list)->height = 0;
    (*list)->leftC = NULL;
    (*list)->rightC = NULL;
}



void leftRotate(TreeNode*& root)//左左
{
    TreeNode *l1 = root;
    TreeNode *l2 = root->leftC;
    l1->leftC = l2->rightC;
    l2->rightC = l1;
    l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1;
    l2
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值