二叉树合集(六):高度平衡的二叉搜索树简介(图文解析)

合集地址

二叉树合集(一):二叉树基础(含四种遍历,图文详解)
二叉树合集(二):霍夫曼树(图文详解)
二叉树合集(三):线索二叉树(图文详解)
二叉树合集(四):对称二叉树(递归和迭代实现)
二叉树合集(五):二叉搜索树(图片详解,含基本操作)
二叉树合集(六):高度平衡二叉树

高度平衡的二叉搜索树简介


在这篇文章中,我们将帮助你理解高度平衡的二叉搜索树的基本概念。

什么是一个高度平衡的二叉搜索树?


树结构中的常见用语:

  • 节点的深度 - 从树的根节点到该节点的边数
  • 节点的高度 - 该节点和叶子之间最长路径上的边数
  • 树的高度 - 其根节点的高度

一个高度平衡的二叉搜索树平衡二叉搜索树)是在插入和删除任何节点之后,可以自动保持其高度最小。也就是说,有*N个节点的平衡二叉搜索树,它的高度是logN*。并且,每个节点的两个子树的高度不会相差超过1。

为什么是logN呢?

  • 一个高度为h的二叉树 img.
  • 换言之,一个有N个节点,且高度为h的二叉树: img.
  • 所以: img.

下面是一个普通二叉搜索树和一个高度平衡的二叉搜索树的例子:

img

根据定义, 我们可以判断出一个二叉搜索树是否是高度平衡的平衡二叉树

正如我们之前提到的, 一个有N个节点的平衡二搜索叉树的高度总是*logN*。因此,我们可以计算节点总数和树的高度,以确定这个二叉搜索树是否为高度平衡的。

同样,在定义中, 我们提到了高度平衡的二叉树一个特性: 每个节点的两个子树的深度不会相差超过1。我们也可以根据这个性质,递归地验证树。

为什么需要用到高度平衡的二叉搜索树?


我们已经介绍过了二叉树及其相关操作, 包括搜索、插入、删除。 当分析这些操作的时间复杂度时,我们需要注意的是树的高度是十分重要的考量因素。以搜索操作为例,如果二叉搜索树的高度为*h*,则时间复杂度为*O(h)*。二叉搜索树的高度的确很重要。

所以,我们来讨论一下树的节点总数*N*和高度*h*之间的关系。 对于一个平衡二叉搜索树, 我们已经在前文中提过, img 。但对于一个普通的二叉搜索树, 在最坏的情况下, 它可以退化成一个链。

因此,具有*N个节点的二叉搜索树的高度在logNN*区间变化。也就是说,搜索操作的时间复杂度可以从logN变化到N。这是一个巨大的性能差异。

所以说,高度平衡的二叉搜索树对提高性能起着重要作用。

如何实现一个高度平衡的二叉搜索树?


有许多不同的方法可以实现。尽管这些实现方法的细节有所不同,但他们有相同的目标:

  1. 采用的数据结构应该满足二分查找属性和高度平衡属性。
  2. 采用的数据结构应该支持二叉搜索树的基本操作,包括在O(logN)时间内的搜索、插入和删除,即使在最坏的情况下也是如此。

我提供了一个常见的的高度平衡二叉树列表供您参考:

我不打算在本文中展开讨论这些数据结构实现的细节。

高度平衡的二叉搜索树的实际应用


高度平衡的二叉搜索树在实际中被广泛使用,因为它可以在*O(logN)*时间复杂度内执行所有搜索、插入和删除操作。

平衡二叉搜索树的概念经常运用在Set和Map中。 Set和Map的原理相似。 我们将在下文中重点讨论Set这个数据结构。

Set(集合)是另一种数据结构,它可以存储大量key(键)而不需要任何特定的顺序或任何重复的元素。 它应该支持的基本操作是将新元素插入到Set中,并检查元素是否存在于其中。

通常,有两种最广泛使用的集合:散列集合(Hash Set)和树集合(Tree Set)。

树集合, Java中的Treeset或者C++中的set,是由高度平衡的二叉搜索树实现的。因此,搜索、插入和删除的时间复杂度都是O(logN)

散列集合, Java中的HashSet或者C++中的unordered_set,是由哈希实现的, 但是平衡二叉搜索树也起到了至关重要的作用。当存在具有相同哈希键的元素过多时,将花费O(N)时间复杂度来查找特定元素,其中N是具有相同哈希键的元素的数量。 通常情况下,使用高度平衡的二叉搜索树将把时间复杂度从 O(N)改善到 O(logN)

哈希集和树集之间的本质区别在于树集中的键是有序的。

总结


高度平衡的二叉搜索树是二叉搜索树的特殊表示形式,旨在提高二叉搜索树的性能。但这个数据结构具体的实现方式,超出了我们这章的内容,也很少会在面试中被考察。但是了解高度平衡二叉搜索树的的基本概念,以及如何运用它帮助你进行算法设计是非常有用的。

原文地址:https://www.cnblogs.com/hzcya1995/p/13308035.html