26考研——查找_树形查找_二叉排序树(BST)(7)

408答疑


文章目录

  • 三、树形查找
    • 二叉排序树(BST)
      • 二叉排序树中结点值之间的关系
      • 二叉树形查找
      • 二叉排序树的查找过程
        • 示例
      • 向二叉排序树中插入结点
        • 插入过程
        • 示例
      • 构造二叉排序树的过程
        • 构造示例
      • 二叉排序树中删除结点的操作
        • 情况一:被删除结点是叶结点
        • 情况二:被删除结点只有一棵左子树或右子树
        • 情况三:被删除结点有左、右两棵子树
        • 二叉排序树中删除并插入某结点的分析
      • 代码实操
        • 结构定义
        • 插入操作
        • 查找操作
        • 删除操作
        • 中序遍历
  • 六、参考资料
    • 鲍鱼科技课件
    • 26王道考研书


三、树形查找

二叉排序树(BST)

  • 构造二叉排序树的目的并不是排序,而是提高查找、插入和删除关键字的速度,二叉排序树这种非线性结构也有利于插入和删除的实现。
  • 二叉排序树(也称二叉查找树)或者是一棵空树,或者是具有下列特性的二叉树:
    1. 若左子树非空,则左子树上所有结点的值均小于根结点的值。
    2. 若右子树非空,则右子树上所有结点的值均大于根结点的值。
    3. 左、右子树也分别是一棵二叉排序树。

二叉排序树中结点值之间的关系

根据二叉排序树的定义,左子树结点值 < 根结点值 < 右子树结点值,因此对二叉排序树进行中序遍历,可以得到一个递增的有序序列。如下图所示二叉排序树的中序遍历序列为 123468。

在这里插入图片描述

二叉树形查找

  • 二叉树形查找是以二叉排序树(BST)为基础进行查找,并演化出相应的平衡树AVL和红黑树RB。
  • 除了掌握基础的查找,还需掌握平衡树的平衡调整过程。

二叉排序树的查找过程

二叉排序树的查找是从根结点开始,沿某个分支逐层向下比较的过程。若二叉排序树非空,先将给定值与根结点的关键字比较,若相等,则查找成功;若不等,若小于根结点的关键字,则在根结点的左子树上查找,否则在根结点的右子树上查找。这显然是一个递归的过程。

示例

如下图中查找值为 4 的结点。首先 4 与根结点 6 比较。由于 4 小于 6,所以在根结点 6 的左子树中继续查找。由于 4 大于 2,所以在结点 2 的右子树中查找,查找成功。

在这里插入图片描述

向二叉排序树中插入结点

二叉排序树作为一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字值等于给定值的结点时再进行插入的。

插入过程
  • 若原二叉排序树为空,则直接插入;
  • 否则,若关键字 k k k 小于根结点值,则插入到左子树,若关键字 k k k 大于根结点值,则插入到右子树。
  • 插入的结点一定是一个新添加的叶结点,且是查找失败时的查找路径上访问的最后一个结点的左孩子或右孩子。
示例

下图展示了在一棵二叉排序树中依次插入结点 28 和结点 58 的过程,虚线表示的边是其查找的路径。

在这里插入图片描述

构造二叉排序树的过程

从一棵空树出发,依次输入元素,将它们插入二叉排序树中的合适位置。设查找的关键字序列为 {45, 24, 53, 45, 12, 24},则生成的二叉排序树如下图所示。

构造示例

在这里插入图片描述

每一步都是根据关键字与当前树中结点的比较结果,决定插入的位置。

二叉排序树中删除结点的操作

在二叉排序树中删除一个结点时,不能简单地删除该结点及其所有子结点,而是需要重新链接因删除结点而断开的二叉链表,确保二叉排序树的性质不丢失。删除操作的实现过程按以下三种情况来处理:

情况一:被删除结点是叶结点
  • 若被删除结点 z z z 是叶结点,则直接删除,不会破坏二叉排序树的性质。

在这里插入图片描述

情况二:被删除结点只有一棵左子树或右子树
  • 若结点 z z z 只有一棵左子树或右子树,则让 z z z 的子树成为 z z z 父结点的子树,替代 z z z 的位置。

在这里插入图片描述

情况三:被删除结点有左、右两棵子树
  • 若结点 z z z 有左、右两棵子树,则令 z z z 的直接后继(或直接前驱)替代 z z z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转变成了第一或第二种情况。

在这里插入图片描述

二叉排序树中删除并插入某结点的分析

若在二叉排序树中删除并插入某结点,得到的二叉排序树是否和原来的相同?

不一定。这个问题需要考虑删除和插入操作对树结构的影响,以及这些操作是否能够恢复到原始的树结构。具体分析可能涉及到树的平衡性、结点的相对位置以及操作的顺序等因素。

代码实操

结构定义
  • 定义二叉排序树的结点结构体 BSTNode,包含数据域 data,指向左子树的指针 left 和指向右子树的指针 right
typedef struct BSTNode {ElemType data;struct BSTNode *left;struct BSTNode *right;
} BSTNode, *BSTRoot;
插入操作
  • 在二叉排序树中插入值 x,递归地找到正确的位置插入新结点。
bool insertBST(BSTNode *&t, int x) {if (t == NULL) {t = (BSTNode*)malloc(sizeof(BSTNode));t->data = x;t->left = t->right = NULL;return true; // 插入成功}if (x == t->data)return false; // 插入失败if (x < t->data)insertBST(t->left, x);elseinsertBST(t->right, x);return true;    
}
查找操作
  • 在二叉排序树中查找关键字 key,递归地遍历树直到找到或到达叶子结点。
BSTNode* searchBST(BSTNode *t, int key) {if (t == NULL || t->data == key)return t;if (key < t->data)return searchBST(t->left, key);else return searchBST(t->right, key);
}
删除操作
  • 删除二叉排序树中关键字为 key 的结点,处理三种情况:无子结点、一个子结点、两个子结点。
bool removeBST(BSTNode *&t, int key) {if (t == NULL)return false; // 删除失败if (key < t->data)removeBST(t->left, key);else if (key > t->data)removeBST(t->right, key);else {BSTNode *p = NULL;if (t->left != NULL && t->right != NULL) {p = t->left;while (p->right != NULL)p = p->right;t->data = p->data;removeBST(t->left, p->data);} else {BSTNode *child = (t->left != NULL) ? t->left : t->right;p = t;t = child;free(p);}}return true;
}
中序遍历
  • 对二叉排序树进行中序遍历,输出有序序列。
void sortBST(BSTNode *t) {if (t != NULL) {sortBST(t->left);printf("%d ", t->data);sortBST(t->right);}
}

六、参考资料

鲍鱼科技课件

b站免费王道课后题讲解:
在这里插入图片描述

网课全程班:
在这里插入图片描述

26王道考研书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库事务、消息队列事务、Redis 事务、Spring 事务 详细分析】

数据库事务、消息队列事务、Redis 事务、Spring 事务** 的详细分析 在分布式系统和应用开发中&#xff0c;事务管理是确保数据一致性和可靠性的关键机制。以下是针对 数据库事务、消息队列事务、Redis 事务、Spring 事务 的详细分析&#xff0c;包括原理、特点、适用场景和对比…

kubectl 命令参数详解与示例

kubectl 命令参数详解与示例 kubectl 是 Kubernetes 的命令行工具&#xff0c;用于与 Kubernetes 集群交互。下面我将详细介绍 kubectl 的主要命令参数&#xff0c;并提供相应的使用示例。 一、基础命令 1. kubectl get - 获取资源信息 常用参数&#xff1a; -n, --namesp…

#vue中解决异步请求的竞态

// composables/useFetchWithoutRace.js import { ref } from vue; import axios from axios;// 定义一个可复用的 Composition 函数&#xff0c;处理带有竞态控制的异步请求 export function useFetchWithoutRace() {// 定义响应式变量 latestRequestId&#xff0c;用于追踪最…

如何在 Postman 中导入和导出 cURL 命令?

cURL 是一款广受欢迎的命令行工具&#xff0c;专门用于执行 HTTP 请求。它在 Web 应用或 API 测试中极为实用&#xff0c;让用户得以借助在 API 开发者社区广为流行的成熟语法&#xff0c;直接通过命令行与 API 进行交互。若你需要在多个环境下运行众多 cURL 命令&#xff0c;可…

用python制作一个贪吃蛇小游戏

文章目录 效果图python源码使用说明效果图 只需要一百多行python代码,就能制作一个贪吃蛇小游戏。效果如下: 操作说明: 你可以使用上下左右箭头键来控制蛇的移动方向。蛇吃到食物后会变长,当蛇撞到墙壁或自己的身体时游戏结束。游戏结束后,你可以按 Q 退出游戏,或按 C…

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15&#xff08;2016&#xff09; 核心架构&#xff1a;Stack Reconciler&#xff08;栈协调器&#xff09; 工作原理&#xff1a; 同步递归渲染&#xff1a;采用深度优先遍历方式递归处理 Virtual DOM&#xff0c;形成不可中断的调用栈渲染流程&#xff1a;1. 触发 …

微信小程序pdf预览

1.示例图 2.代码 fileId&#xff1a;要预览的pdf文件的id viewsFiles(fileId) {wx.showLoading({title: 加载中...});var params {url: "/common/getFile/" fileId ,//后端提供的接口method: "GET",responseType: "arraybuffer",callBack: …

雪花算法生成分布式唯一ID

雪花算法的结构是由时间戳、工作机器ID和序列号构成。要确保全局唯一&#xff0c;必须保证每个节点的机器ID唯一&#xff0c;并且同一毫秒内序列号不重复。在分库分表的环境下使用雪花算法&#xff0c;机器ID的分配是关键。常见的做法是通过分布式系统协调&#xff0c;比如使用…

把手搭建vue前后端管理系统-TAB标签通过pinia来进行管理(二十六)

目标&#xff1a;通过pinia的store来进行组件状态的统一管理&#xff0c;这样大家都可以共用到这个组件的状态信息&#xff0c;就可以实现组件的联动 一、添加侧边栏菜单的点击事件&#xff1a; 1、CommonAside.vue里面添加click的事件 <el-menu-itemv-for"item in …

this(执行上下文)

&#x1f6a9; 这个专栏是一个 JS 进阶系列&#xff0c;当前内容为 JS 执行机制&#xff0c;建议按顺序阅读 执行上下文&作用域 词法环境&变量环境 this&#xff08;上下文对象&#xff09; &#x1f539; 概述 &#x1f30d; 前提概要&#xff1a; 在上文 执行上下文&…

计算机网络——数据链路层的功能

目录 物理链路 逻辑链路 封装成帧&#xff08;组帧&#xff09; 帧定界 透明传输 SDU 差错控制 可靠传输 流量控制 介质访问控制 主机需要实现第一层到第五层的功能&#xff0c;而路由器这种节点只需要实现第一层到第三层的这些功能 假设左边用户需要给右边用户发送…

计算机网络 --应用层

计算机网络 --应用层 一、应用层概述 1. 功能 应用层为应用程序通信提供直接服务&#xff0c;这种服务是用户能够直接感知到的数据通信服务。核心功能包括&#xff1a; 文件传输&#xff1a;实现不同设备间文件的传输操作。访问管理&#xff1a;对用户访问资源等进行管理。电…

企业级Linux服务器初始化优化全流程

实战指南&#xff1a;企业级Linux服务器初始化优化全流程 本文基于某电商平台百万级并发服务器的真实调优案例整理&#xff0c;所有操作均在Rocky Linux8.5验证通过&#xff0c;不同发行版请注意命令差异 一、服务器安全加固&#xff08;Situation-Task-Action-Result&#xff…

OpenAI流式解析

OpenAI 流式的代码&#xff1a; 首选一般请使用os.getenv 去读环境变量的内容 注意使用pip install python-dotenv 的安装方法 load_dotenv 是这个库提供的一个函数&#xff0c;用于读取 .env 文件并将其中定义的键值对设置为系统的环境变量。 默认情况下&#xff0c;load_…

数据抓取的缓存策略:减少重复请求与资源消耗

在数据采集领域&#xff0c;爬虫效率是决定项目成败的关键因素之一。传统的爬虫架构往往因请求频繁、资源消耗较大以及重复抓取等问题&#xff0c;导致效率低下。这些问题不仅拖慢了数据获取的速度&#xff0c;还可能引发目标服务器的过载风险&#xff0c;甚至导致爬虫被限制。…

k8s部署argocd

前言 ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitHelmArgocd方式来实现在k8s中部署和更新应用服务&#xff1b; 安装Argocd 准备一个k8s集群&#xff0c;然…

【Linux】MAC帧

目录 一、MAC帧 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC帧格式 &#xff08;三&#xff09;MTU对IP协议的影响、 &#xff08;四&#xff09;MTU对UDP协议的影响 &#xff08;五&#xff09;MTU对TCP协议的影响 二、以太网协议 &…

MySQL - 数据库基础操作

SQL语句 结构化查询语言(Structured Query Language)&#xff0c;在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language)&#xff0c;定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…

GraalVM原生镜像支持:Spring Cloud应用启动速度提升90%

引言&#xff1a;当Spring Cloud遇见GraalVM&#xff0c;启动时间进入秒级时代 传统Spring Cloud应用因动态类加载、反射等机制导致启动缓慢&#xff08;通常超过30秒&#xff09;&#xff0c;在Serverless和Kubernetes滚动更新场景下成为性能瓶颈。Spring Cloud 2023.x通过**G…

【Unity3D】摄像机适配场景以及Canvas适配

目录 宽度不变策略 高度不变策略 宽度不变策略 开发分辨率 750*1334 (宽高比:0.56) 真机分辨率 1170*2532 (宽高比:0.46) 真机宽高比<开发宽高比&#xff0c;采用宽度不变策略 理由&#xff1a;小于代表真机高度比开发高度更大&#xff0c;因此不需要担心高度上…