| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 二叉搜索树导览,一文拿下 BST&AVL -> 正文阅读 |
|
[数据结构与算法]二叉搜索树导览,一文拿下 BST&AVL |
文章目录01 二叉搜索树 BST1.1 什么是二叉搜索树? 二叉搜索树(又称:二叉查找树,二叉排序树,Binary Search Tree, BST)是一种特殊的二叉树:对于每个父节点,其左子节点的值 ? 因此对于一个二叉搜索树,我们可以在 ? 同时因为二叉查找树是有序的,对其中序遍历的结果即为排好序的数组。 ? 一个二叉搜索树实例 ? 二叉搜索树除了创建二叉树之外的基本操作有三种:1?? 搜索 2?? 插入 3?? 删除 1.2 BST 的节点属性? 和普通二叉树一样,二叉搜索树的每个节点至少有 3 个属性:左孩子,右孩子和数据值,它然节点还可以包含其他潜在的属性 🐾。 二叉搜索树节点的结构体声明可以如下:
? 🔖二叉搜索树的节点放置规则是 🔖:任何节点的数据值一定大于其左子树中的每个节点的数据值,并小于其右子树中的每个节点的数据值。所以,在遍历二叉搜索树时,一直往左走可以得到最小元素,一直往右走可以得到最大元素。 1.3 BST 的中序遍历? 我们再来复习一遍二叉搜索树的特性 👀 :左子树上所有结点的值均小于它的根结点的值,右子树上所有结点的值均大于它的根结点的值。 ? 依据这一特性我们可以推出二叉搜索树的另一个重要特性:二叉搜索树的中序遍历序列是一个递增序列?? ? 二叉搜索树的中序遍历实现和普通二叉树一样,也有递归和非递归的实现方式。但是无论 BST 的高度如何,中序遍历的时间复杂度都是 ? (1)递归实现方式:先遍历左节点,再遍历父结点,最后遍历右节点
? (2)非递归实现方式: ? 二叉树中序遍历是从左子树的最左边的叶子节点开始处理,是自下而上的递归。 ? ?? 节点访问过程:由于是自下而上的访问,使用迭代实现中序遍历需要一个额外的指针来访问节点,从根节点一层层向左访问到左子树的最左边的叶子节点并逐个入栈,再开始向上迭代处理节点值。完成访问之后,栈中保存的是从根节点到最左边的叶子节点路径上的所有节点,他们都是左节点。 ? ?? 节点处理过程:直接取栈顶元素将其值加入结果集,然后查看它是否具有右节点。如果有右节点则使用指针从该节点开始进行和根节点一样的访问过程,将从该节点开始到以该节点为根节点的子树的最左叶子节点路径上的所有节点入栈。完成访问之后再重复处理过程,最终完成所有节点的访问和处理。 ? 实现代码如下:
1.4 BST 搜索? 二叉搜索树,最为基础的操作当然就是搜索了。 ? 二叉树搜索过程中使用根结点 root ?? 和目标值 target 🎯 进行比较,不同情况处理如下:
? 搜索过程的代码实现如下:
? 除了快速搜索目标值,二叉搜索树中还可以 查找最大值和最小值 ? 🔖二叉搜索树的节点放置规则是 🔖:任何节点的数据值一定 ? 查找最大值和最小值的代码实现如下:
? 二叉搜索树的搜索时间复杂度与其自身高度 h 相关,通常为 1.5 BST 插入? 二叉搜索树中插入新元素时,从根节点开始寻找插入位置,遇到数据值较大的节点就向左,遇到数据值较小的节点就向右。重复上述步骤一直到尾端,最终完成插入位置的寻找,然后插入新节点。 ? 我们还是使用递归实现二叉搜索树的插入操作:
? 向上述二叉搜索树插入 ? 代码实现如下:
? 二叉搜索树插入的时间复杂度也是 1.6 BST 删除的三种情况? 二叉搜索树的删除操作还是通过与搜索操作相似先找到要删除的节点:
1.6.1 目标节点是叶子节点? 1?? 第一种情况是最简单的,目标节点是当前二叉搜索树的叶子节点之一。 ? 要删除叶子顶点很容易,我们只需要找到这个节点并将其删除就可以了,下图展示了删除上述二叉搜索树叶子节点 1.6.2 目标节点有一个子节点? 2?? 第二种情况也不是那么难:目标节点是当前二叉搜索树的非叶子节点,但是它只有一个子节点。 ? 删除这个节点时我们只需要将该节点的唯一的子节点与该节点的父节点连接即可,下图展示了删除上述二叉搜索树中只有一个子节点 1.6.3 目标节点有两个子节点? 3?? 第三种情况是三者中最复杂的:目标节点是当前二叉搜索树中具有两个叶子节点的非叶子节点。 ? 删除该节点需要进行如下步骤:
? 下图展示了删除上述二叉搜索树具有两个叶子节点 ? 二叉搜索树删除操作的代码实现如下:
? 二叉搜索树删除操作的时间复杂度也是 02 平衡二叉搜索树? 在二叉搜索树 BST 的介绍过程中,我们不断提到了操作的时间复杂度,其中除了中序遍历之外,大部分操作的时间复杂度都是 O(h) ,即与 BST 自身的高度相关 🌲。 ? 而普通二叉搜索树可能会出现向右倾斜或向左倾斜的情况,即导致其高度为 ? 为了降低二叉搜索树操作的时间复杂度,我们将讨论平衡二叉搜索树的概念,以使得 二叉树的极度平衡和极度不平衡状态如下图所示: ? 树形结构是否平衡并没有绝对的衡量标准,它指的是没有任何一个节点深度过大。不同的平衡条件,可以实现不同的树形操作效率,也会带来不同的实现复杂度。 ? 用的最多的平衡标准是:其左子树和右子树均为平衡二叉树,且左子树和右子树的高度差的绝对值不超过 1。这使得含有 N 个结点的平衡二叉树的最大深度为 ? 基于平衡二叉树的概念,已经有多种实现平衡二叉搜索树的数据结构,例如 03 高度平衡二叉搜索树 AVL3.1 什么是 AVL? AVL-Tree,是由两位俄罗斯(苏联)发明家 Georgy Adelson-Velskii 和 Evgenii Landis 在 1962 年提出的。 ? AVL-Tree 使用的平衡标准就是:二叉搜索树所有非叶子节点的左子树和右子树均为平衡二叉树,且左子树和右子树的高度差的绝对值不超过 1。该平衡条件就是为了确保整颗二叉搜索树的深度为 ? 自平衡二叉搜索树 AVL 是带了自平衡功能的二叉搜索树。当对其进行插入或删除操作后破坏了平衡条件时,它能够进行调整,使整颗树的高度平衡为 3.2 树的旋转? 由于 AVL-Tree 的平衡条件,对其进行插入和删除操作后可能破坏整颗树的平衡,平衡被破坏后 AVL 能够自行进行调整恢复平衡。首先,找到平衡被破坏中的各个非叶子节点中深度最深的那一个 🙋。 ? 由于二叉树最多有两个子节点,而平衡被破坏即为该节点的左右子树的
? 情况 1 和 2 又可以称为外侧插入,使用单旋转操作调整恢复平衡;情况 3 和 4 称为内侧插入,使用双旋转操作调整恢复平衡。 3.2.1 LL 单旋转? 上述 AVL-Tree 中的节点 ? 为了调整平衡状态,需要将以
? AVL-Tree LL型调整操作的代码实现如下:(代码来源,如有侵权请告知)
3.2.2 RR 单旋转? 上述 AVL-Tree 中的节点 ? 为了调整平衡状态,需要将以
? AVL-Tree RR型调整操作的代码实现如下:(代码来源,如有侵权请告知)
3.2.3 LR 双旋转? 上述 AVL-Tree 中的节点 ? 这种情况我们无法直接使用 LL 或者 RR 的单旋转完整调整,因为旋转之后仍然是不平衡的。为了调整平衡状态,需要将以 ? 这一过程需要进行两次单旋转,首先进行 RR 单向左旋转让 ? AVL-Tree LR型调整操作的代码实现如下:(代码来源,如有侵权请告知)
3.2.4 RL 双旋转? 上述 AVL-Tree 中的节点 ? 这种情况我们无法直接使用 LL 或者 RR 的单旋转完整调整,因为旋转之后仍然是不平衡的。为了调整平衡状态,需要将以 ? 这一过程需要进行两次单旋转,首先进行 LL 单向右旋转让 ? AVL-Tree RL型调整操作的代码实现如下:(代码来源,如有侵权请告知)
3.3 AVL 插入与删除3.3.1 AVL 插入? 介绍完树的旋转,其实就已经介绍完了 AVL-Tree 的核心步骤。 ? AVL-Tree 插入的总体步骤如下:
3.3.2 AVL 删除? AVL 删除和 AVL 插入本质上是相似的方法,核心还是在于使用树旋转调整平衡状态。 ? AVL-Tree 删除的总体步骤如下:
插入删除操作总结: ? BST 插入和删除操作与AVL 的插入和删除操作相比的主要区别在于:可能会多次触发四种可能的需要重新平衡情况中的一种,但时间复杂度不会超过 参考资料如果文章对你有帮助,别忘了一键三连呀 👍 💬 ?? 。你的支持是我坚持的最大动力 🔥🔥🔥 。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:45:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |