平衡二叉树(AVL 树):概念、实现原理和算法代码

本文介绍了AVL树的概念,作为平衡二叉搜索树,其特点是左右子树高度差不超过1。AVL树的平衡通过单旋转和双旋转操作来维护。文章详细阐述了四种插入情况下的旋转策略,并提供了代码实现。
摘要由CSDN通过智能技术生成

引入

上一篇中已经介绍了二叉搜索树(BST),在二叉搜索树的复杂度分析中,我们提到,二叉搜索树的算法复杂度与其拓扑结构(具体来说是其树的深度)有关。当 BST 最为「平衡」时,查找、删除、插入的算法为 O ( log ⁡ n ) O(\log{n}) O(logn),而最不平衡情况下,算法复杂度为 O ( n ) O(n) O(n)

当节点数 n n n 增长时, O ( log ⁡ n ) O(\log{n}) O(logn) 的算法相对于 O ( n ) O(n) O(n) 的算法在运算次数上增长较慢,性能更优。

因此,我们希望按照更加「平衡」的方式构建二叉树。那么,能否让二叉树一层一层地「铺满」,构建出一个完全二叉树?可以的,但是这样的插入算法较为复杂。我们下面介绍一种比较容易实现的解决平衡二叉树的算法——AVL 树,它是由两位俄罗斯数学家 G. M. Adelson-Velsky 和 Evgenii Landis 在 1962 年发明的。

定义

怎样的一棵树可以被称为高度平衡的呢?

一棵 BST 若要成为平衡二叉树,应满足:

  • 其左子树和右子树深度之差绝对值不超过 1
  • 其左子树和右子树也是平衡二叉树

这是一个具有递归特征的定义。值得注意的是,从定义上说,空树也属于一种特殊的平衡二叉树。

引入平衡因子 (Balance Factor, BF) 的概念,平衡因子是指二叉树上一个节点的左子树与右子树的深度之差。一棵平衡二叉树,其任意节点上的平衡应为 - 1、0 或 1。

根据平衡二叉树的定义,下面给出一些例子,节点左上角标注的是当前节点的平衡因子:

图一是一个平衡二叉树,它满足平衡二叉树的定义。图二不是平衡二叉树,其原因并不是不满足平衡因子的条件,而是因为它不满足 BST 的构成条件,这提醒我们平衡二叉树首先要是一棵 BST。图三满足平衡二叉树的构成条件。图 4 中的节点 (8) 平衡因子为 3,不满足平衡二叉树的要求。

实现原理

概述

AVL 树的实现原理是,在构建 BST 时,时刻对 BST 进行「监督」,即每插入一个节点,便检查插入操作是否破坏了 BST 的平衡性。

如果当前的插入操作破坏了平衡性,那么要找出最小不平衡子树,对其执行某种「旋转」操作来调整其中节点的连接关系,使之重新平衡。

这里所说的最小不平衡子树,指的是以离插入节点最近,且平衡因子绝对值大于 1 的节点为根的子树。(注意:是离插入节点最近,而不是离根节点最近)

那么问题的关键就是,如何进行这种「旋转」调整,使得树始终保持平衡?下面将进行叙述。

根据插入操作发生位置的不同,可以将需要进行调平的情况分成下面四类(记最小不平衡子树的根节点为 N N N):

  • 情况①:对 N N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值