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

news2025/3/30 17:15:41

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);
    else
        insertBST(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.coloradmin.cn/o/2322911.html

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

相关文章

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

21.Excel自动化:如何使用 xlwings 进行编程

一 将Excel用作数据查看器 使用 xlwings 中的 view 函数。 1.导包 import datetime as dt import xlwings as xw import pandas as pd import numpy as np 2.view 函数 创建一个基于伪随机数的DataFrame&#xff0c;它有足够多的行&#xff0c;使得只有首尾几行会被显示。 df …

LabVIEW FPGA与Windows平台数据滤波处理对比

LabVIEW在FPGA和Windows平台均可实现数据滤波处理&#xff0c;但两者的底层架构、资源限制、实时性及应用场景差异显著。FPGA侧重硬件级并行处理&#xff0c;适用于高实时性场景&#xff1b;Windows依赖软件算法&#xff0c;适合复杂数据处理与可视化。本文结合具体案例&#x…

【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】

目录 一、ICL的优势 1.传统做法 2.ICL做法 二、ICL的发展 三、ICL成因的两种看法 1.meta learning 2.Bayesian Inference 四、ICL要点 ① 语言模型的规模 ② 提示词prompt中提供的examples数量和顺序 ③ 提示词prompt的形式&#xff08;format&#xff09; 五、fine-tune VS I…

vue 中渲染 markdown 格式的文本

文章目录 需求分析第一步:安装依赖第二步:创建 Markdown 渲染组件第三步,使用实例扩展功能1. 代码高亮:2. 自定义渲染规则:需求 渲染 markdown 格式的文本 分析 在Vue 3中实现Markdown渲染的常见方法。通常有两种方式:使用现有的Markdown解析库,或者自己编写解析器…

工业4G路由器赋能智慧停车场高效管理

工业4G路由器作为智慧停车场管理系统通信核心&#xff0c;将停车场内的各个子系统连接起来&#xff0c;包括车牌识别系统、道闸控制系统、车位检测系统、收费系统以及监控系统等。通过4G网络&#xff0c;将这些系统采集到的数据传输到云端服务器或管理中心&#xff0c;实现信息…

企业如何平稳实现从Tableau到FineBI的信创迁移?

之前和大家分享了《如何将Tableau轻松迁移到Power BI》。但小编了解到&#xff0c;如今有些企业更愿意选择国产BI平台。为此&#xff0c;小编今天以Fine BI为例子&#xff0c;介绍如何从Tableau轻松、低成本地迁移到国产BI平台。 在信创政策全面推进的背景下&#xff0c;企业数…

蓝桥与力扣刷题(蓝桥 蓝桥骑士)

题目&#xff1a;小明是蓝桥王国的骑士&#xff0c;他喜欢不断突破自我。 这天蓝桥国王给他安排了 N 个对手&#xff0c;他们的战力值分别为 a1,a2,...,an&#xff0c;且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战&#xff0c;也可以选择避战。 身为高傲的骑士&a…

前端学习笔记--CSS

HTMLCSSJavaScript 》 结构 表现 交互 如何学习 1.CSS是什么 2.CSS怎么用&#xff1f; 3.CSS选择器&#xff08;重点&#xff0c;难点&#xff09; 4.美化网页&#xff08;文字&#xff0c;阴影&#xff0c;超链接&#xff0c;列表&#xff0c;渐变。。。&#xff09; 5…

31天Python入门——第15天:日志记录

你好&#xff0c;我是安然无虞。 文章目录 日志记录python的日志记录模块创建日志处理程序并配置输出格式将日志内容输出到控制台将日志写入到文件 logging更简单的一种使用方式 日志记录 日志记录是一种重要的应用程序开发和维护技术, 它用于记录应用程序运行时的关键信息和…

使用ucharts写的小程序,然后让圆环中间的空白位置变大

将ringWidth属性调小 extra: { ring: { ringWidth: 20, activeOpacity: 1.5, activeRadius: 10, offsetAngle: 0, labelWidth: 15, border: true, borderWidth: 0, borderColor: #F…

GPT-4o Image

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C++:函数(通识版)

一、函数的基础 1.什么是函数&#xff1f;&#xff08;独立的功能单位&#xff09; 函数是C中封装代码逻辑的基本单元&#xff0c;用于执行特定任务。 作用&#xff1a;代码复用、模块化、提高可读性。 2、函数的基本结构 返回类型 函数名(参数列表) {// 函数体return 返回值…

无线安灯按钮盒汽车零部件工厂的故障告警与人员调度专家

在汽车零部件制造领域&#xff0c;生产线故障与物料短缺等问题往往引发连锁反应&#xff0c;导致停机损失与成本激增。传统人工巡检与纸质工单模式已难以满足高效生产需求&#xff0c;而无线安灯按钮盒的智能化应用&#xff0c;正成为破解这一难题的关键利器。 一、精准告警&am…

登录接口带验证码自动化(tesseract-OCR)

登录接口是很多网站和应用程序中必不可少的一部分。为了增加安全性&#xff0c;很多登录接口还会加入验证码的验证步骤&#xff0c;以防止恶意登录行为。 通常&#xff0c;遇到这样情况时有以下解决办法 1、使用万能验证码&#xff1a;如果遇到前台输入的是万能验证码&#xf…

【Python】pillow库学习笔记2-ImageFilter类和ImageEnhance类

PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法。 3.ImageFilter类 ImageFilter类共提供10种预定义图像过滤方法&#xff1a; 方法表示描述ImageFilter.BLUR图像的模糊效果ImageFilter.CONTOUR图像的轮廓效果ImageFilter.DETAIL图像的细节效果ImageFi…

3.Matplotlib:绘图参数文件和绘图的主要函数

一 绘图参数文件 1.绘图参数文件是什么 可以通过在程序中添加代码对参数进行配置&#xff0c;但是如果一个项日对于 Matplotlib 的特性参数总会设置相同的值&#xff0c;就没有必要在每次编写代码的时候都进行相同的配置。在代码之外使用一个永久的文件设定 Matplotlib 参数默认…

飞书只有阅读权限的文档下载,飞书文档下载没有权限的文件

wx搜索公zhong号&#xff1a;"狮心王"回复"飞书文档保存"下载chrome扩展文件 拿到扩展文件之后给chrome添加扩展

【开题报告+论文+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现

项目背景与意义 在全球范围内&#xff0c;安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会&#xff0c;人们面临的生活、工作环境日益复杂&#xff0c;交通事故、火灾、溺水、突发疾病等各种意外事件的发生…

蓝桥杯 - 简单 - 布局切换

介绍 为了提高用户体验&#xff0c;网站有时需要多种浏览模式。现在特邀请你为蓝桥官网设计具有经典、浏览和工具三种布局模式。使用户可以根据具体情况选择合适的模式&#xff0c;以便更好地浏览网页内容。 本题需要在已提供的基础项目中使用 JS 完善代码实现布局的切换。 …