二叉搜索树和AVL树的区别

2025年4月19日 | 阅读 7 分钟

在了解二叉搜索树和AVL树的区别之前,我们应该分别了解二叉搜索树和AVL树。

什么是二叉搜索树?

二叉搜索树是一种遵循二叉树条件的数据结构。我们知道,树可以有'n'个子节点,而二叉树最多只能包含两个子节点。因此,二叉搜索树也遵循二叉树的约束。二叉搜索树中的每个节点最多应该有两个子节点;换句话说,我们可以说二叉搜索树是二叉树的一个变体。

二叉搜索树也遵循二叉搜索的特性。在二叉搜索中,数组中的所有元素必须按排序顺序排列。我们计算二叉搜索中的中间元素,其中中间元素的左侧部分包含小于中间值的值,中间元素的右侧部分包含大于中间值的值。

在二叉搜索树中,中间元素成为根节点,右侧部分成为右子树,左侧部分成为左子树。因此,我们可以说二叉搜索树是二叉树二叉搜索的组合。

注意:二叉搜索树可以定义为这样一种二叉树:其左子树的所有元素都小于根节点,其右子树的所有元素都大于根节点。

二叉搜索树的时间复杂度

如果二叉搜索树几乎是平衡的,那么所有操作的时间复杂度将是 O(logn),因为搜索被分为左子树或右子树。

如果二叉搜索树是左偏或右偏的,那么所有操作的时间复杂度将是 O(n),因为我们需要遍历 n 个元素。

什么是AVL树?

AVL树是一种自平衡二叉搜索树,其中左右子树的高度差不能大于一。这个差值被称为平衡因子。在AVL树中,平衡因子的值可以是-1、0或1。

二叉搜索树如何实现自平衡?

我们知道AVL树是一种自平衡二叉搜索树。如果二叉搜索树不平衡,可以通过一些重新排列来实现自平衡。这些重新排列可以通过一些旋转操作来完成。

让我们通过一个例子来理解自平衡。

假设我们想在AVL树中插入10, 20, 30

以下是在AVL树中插入10, 20, 30的方法

  • 如果插入顺序是30, 20, 10。

步骤1: 首先,我们创建一个二叉搜索树,如下图所示

Binary Search tree vs AVL tree

步骤2: 在上图中,我们可以观察到树是不平衡的,因为节点30的平衡因子是2。为了使其成为AVL树,我们需要执行一些旋转操作。如果我们对节点20执行右旋转,那么节点30将向下移动,而节点20将向上移动,如下图所示

Binary Search tree vs AVL tree

正如我们所观察到的,最终的树遵循二叉搜索树的属性并且是一个平衡树;因此,它是一个AVL树。

在这种情况下,树是左不平衡树,所以我们对节点执行右旋转。

  • 如果插入顺序是10, 20, 30。

步骤1: 首先我们创建一个二叉搜索树,如下图所示

Binary Search tree vs AVL tree

步骤2: 在上图中,我们可以观察到树是不平衡的,因为节点10的平衡因子是-2。为了使其成为AVL树,我们需要执行一些旋转操作。这是一个右不平衡树,所以我们将执行左旋转。如果我们对节点20执行左旋转,那么节点20将向上移动,节点10将向下移动,如下图所示

Binary Search tree vs AVL tree

正如我们所观察到的,最终的树遵循二叉搜索树的属性和平衡树的属性;因此,它是一个AVL树。

  • 如果插入顺序是30, 10, 20

步骤1: 首先我们创建二叉搜索树,如下图所示

Binary Search tree vs AVL tree

步骤2: 在上图中,我们可以观察到树是不平衡的,因为根节点的平衡因子是2。为了使其成为AVL树,我们需要执行一些旋转操作。上述情况是左右不平衡的,因为一个节点是其父节点的左子节点,另一个节点是其父节点的右子节点。首先,我们将执行左旋转,旋转发生在节点10和20之间。左旋转后,20将向上移动,10将向下移动,如下图所示

Binary Search tree vs AVL tree

树仍然不平衡,所以我们对树执行右旋转。一旦对树执行右旋转,树将变成如下图所示

Binary Search tree vs AVL tree

正如我们在上图中观察到的,该树遵循二叉搜索树的属性和平衡树的属性;因此,它是一个AVL树。

  • 如果插入顺序是10, 30, 20

步骤1: 首先,我们创建二叉搜索树,如下图所示

Binary Search tree vs AVL tree

步骤2: 在上图中,我们可以观察到树是不平衡的,因为根节点的平衡因子是2。为了使其成为AVL树,我们需要执行一些旋转操作。上述情况是右左不平衡的,因为一个节点是其父节点的右子节点,另一个节点是其父节点的左子节点。首先,我们将执行右旋转,旋转发生在节点30和20之间。右旋转后,20将向上移动,30将向下移动,如下图所示

Binary Search tree vs AVL tree

上图中的树仍然不平衡,所以我们需要对节点执行左旋转。一旦执行左旋转,节点20将向上移动,节点10将向下移动,如下图所示

Binary Search tree vs AVL tree

正如我们在上图中观察到的,该树遵循二叉搜索树的属性和平衡树的属性;因此,它是一个AVL树。

二叉搜索树和AVL树的区别

Binary Search tree vs AVL tree
二叉搜索树AVL 树
每个二叉搜索树都是二叉树,因为这两种树最多都包含两个子节点。每个AVL树也是二叉树,因为AVL树也最多有两个子节点。
在BST中,不存在平衡因子这个术语。在AVL树中,每个节点都包含一个平衡因子,平衡因子的值必须是-1、0或1。
每个二叉搜索树都不是AVL树,因为BST可以是平衡树或不平衡树。每个AVL树都是二叉搜索树,因为AVL树遵循BST的属性。
二叉搜索树中的每个节点都由三个字段组成,即左子树、节点值和右子树。AVL树中的每个节点都由四个字段组成,即左子树、节点值、右子树和平衡因子。
在二叉搜索树的情况下,如果我们要插入任何节点,我们会将节点值与根值进行比较;如果节点值大于根节点值,则将节点插入到右子树中,否则将节点插入到左子树中。节点插入后,无需检查高度平衡因子即可完成插入。在AVL树的情况下,首先,我们会找到合适的插入节点的位置。节点插入后,我们会计算每个节点的平衡因子。如果每个节点的平衡因子都满足,则插入完成。如果平衡因子大于1,则需要执行一些旋转操作以平衡树。
在二叉搜索树中,树的高度或深度是O(n),其中n是二叉搜索树中节点的数量。在AVL树中,树的高度或深度是O(logn)。
由于我们必须遵循二叉搜索的属性来插入节点,因此实现起来很简单。实现起来很复杂,因为在AVL树中,我们必须首先构建AVL树,然后需要检查高度平衡。如果高度不平衡,则需要执行一些旋转操作来平衡树。
BST不是平衡树,因为它不遵循平衡因子的概念。AVL树是高度平衡树,因为它遵循平衡因子的概念。
当树中存在大量节点时,BST中的搜索效率低下,因为高度不平衡。即使树中存在大量节点,AVL树中的搜索效率也很高,因为高度是平衡的。