数据结构与算法 -- 平衡二叉树的构建

本文介绍了平衡二叉树(AVL树)的构建过程,通过实例分析了如何在插入节点后通过左旋、右旋以及双旋操作保持树的平衡,确保查找效率。详细讲解了不同情况下旋转的规律和平衡因子的处理方式。

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

数据结构与算法 -- 平衡二叉树的构建

前言

上一篇学习了一些常见的静态查找和动态查找中二叉搜索树的查找,插入和删除操作。在构建一个二叉搜索树的时候,假如给定的数据是一直递增的,那么就会一直存储在右子树上,构成一个斜树。这时在对其做查找时,效率一样很低。

那么在构建二叉搜索树的时候,怎么解决这样问题呢?接下来我们介绍一下利用平衡二叉树解决二叉搜索树失衡的问题。

1. 平衡二叉树构建分析

平衡二叉树:是一种二叉排序树,其中每一个结点的左右子树的高度差至多等于1。平衡二叉树又称为AVL树

高度平衡:要么是一个空树,要么左右子树都是平衡二叉树。且左子树和右子树的深度差绝对值不超过1;我们将二叉树上左子树的深度减去右子树的深度的值称为平衡因子BF

最小不平衡子树:距离插入点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树

如上图中,当插入新节点37时,就会打乱原有的平衡,图中圈出来的就是最小不平衡子树。

平衡二叉树构建的基本思想:在构建二叉排序树的过程中,每当插入新结点是,先检查是否因插入而破坏了树的平衡性,若是,则找到最小不平衡子树,在保证二叉排序树特性的前提下,调整最小不平衡子树中各节点之间的链接关系,进行左旋或者右旋,使之成为最新的平衡子树

接下来,我们举个例子分析一下:

假设数组a[10] = {3,2,1,4,5,6,7,10,9,8}

在构建正常的二叉排序树,如下:

显然是失衡的,不能构成平衡二叉树

接下来,我们来模拟一下平衡二叉树

  • 首先插入结点 3,2,1的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMz4zGHC-1590137686477)(https://user-gold-cdn.xitu.io/2020/5/22/1723a3da69fa1dbc?w=761&h=356&f=png&s=22368)]

当依次插入结点3、2、1后,结点3的平衡因子是2,进行右旋。

  • 插入结点 4


插入结点4后,没有失衡

  • 插入结点 5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0au4hsI3-1590137686492)(https://user-gold-cdn.xitu.io/2020/5/22/1723a53e8c4c4296?w=867&h=408&f=png&s=28139)]

当插入结点5时,结点3平衡因子-2,成为最小不平衡子树,进行左旋。

  • 插入结点 6

当插入结点6时,结点2平衡因子-2,成为最小不平衡子树,进行左旋。

  • 插入结点7

结点5平衡因子-2,成为最小不平衡子树,进行左旋。

  • 插入结点10

插入后没有破坏原来的平衡

  • 插入结点9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oR5oJgVb-1590137686503)(https://user-gold-cdn.xitu.io/2020/5/22/1723a5a4ca9c683d?w=532&h=372&f=png&s=46088)]

结点7平衡因子<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值