数据结构——平衡二叉树

本文介绍了平衡二叉树(AVL)的概念,其特点是任意节点的平衡因子绝对值不超过1。讨论了如何判断一棵二叉树是否为平衡二叉树,以及在插入新节点后如何通过单旋转和双旋转进行调整,包括LL、RR、LR和RL四种旋转方式,以保持树的平衡状态。

在这里插入图片描述

平衡二叉树(AVL)

任意结点的平衡因子的绝对值不超过1(左子树高度−-右子树高度)。

高度为hhh的最小平衡二叉树的结点数NhN_hNh

在这里插入图片描述

右子树可以有三种选择:NhN_{h}NhNh−1N_{h-1}Nh1Nh−2N_{h-2}Nh2

  • 如果是NhN_{h}Nh,则加上根结点高度会超过hhh,不可能;
  • h−1h-1h1层的结点数一定大于h−2h-2h2层的结点数,因此最小的平衡二叉树应在h−2h-2h2层的子树上。

Nh=Nh−1+Nh−2+1 N_h=N_{h-1}+N_{h-2}+1 Nh=Nh1+Nh2+1

N0=0N_0=0N0=0N1=1N_1=1N1=1

判断

利用递归遍历的后序遍历过程:

  1. 判断左子树是一棵平衡二叉树
  2. 判断右子树是一棵平衡二叉树
  3. 判断该结点为根的二叉树为平衡二叉树

判断条件

若左子树和右子树均为平衡二叉树

且左子树与右子树高度的绝对值小于等于111,则平衡。

在这里插入图片描述

void Judge_AVL(BiTree bt, int &balance, int &h){
    int bl=0,br=0mhl=0,hr=0;
    if(bt==NULL){
        h=0;
        balance=1;
    }
    else if(bt->lchild==NULL&&bt->rchild==NULL){
        h=1;
        balance=1;
    }
    else{
        Judge_AVL(bt->lchild,bl,hl);
        Judge_AVL(bt->rchild,br,hr);
        if(hl>hr)
            h=hl+1;
        else
            h=hr+1;
        if(abs(hl-hr)<2&&bl=1&&br=1)
            balance=1;
        else
            balance=0;
    }
}

插入

对二叉排序树进行优化:先插入,再调整,每次调整最小不平衡二叉树

在这里插入图片描述

LL平衡旋转(右单旋转)

原因:在结点AAA的左孩子的左子树上插入了新结点。

调整方法右旋操作——将AAA的左孩子BBB代替AAA,将AAA结点称为BBB的右子树根结点,而BBB的原右子树则作为AAA的左子树。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RR平衡旋转(左单旋转)

原因:在结点AAA的右孩子的右子树上插入了新结点。

调整方法:左旋操作——将AAA的右孩子BBB代替AAA,将AAA结点称为BBB的左子树根结点,而BBB的原左子树则作为AAA的右子树。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LR平衡旋转(先左后右双旋转)

原因:在结点AAA的左孩子的右子树上插入了新结点。

调整方法先左后右双旋转——将AAA的左孩子BBB的右孩子结点CCC代替BBB,然后再将CCC结点向上代替AAA的位置。
在这里插入图片描述
在这里插入图片描述

RL平衡旋转(先右后左双旋转)

原因:在结点AAA的右孩子的左子树上插入了新结点。

调整方法先右后左双旋转——将AAA的右孩子BBB的左孩子结点CCC代替BBB,然后再将CCC结点向上代替AAA的位置。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值