数据结构-二叉查找树(BST)

二叉查找树

在这里插入图片描述

需要满足这些规则:

  • 左子节点小于父节点
  • 右子节点大于父节点

查找的效率

非常好,每次都能根据大小去舍弃另一半的分支,极大的减少的比对次数

具体的性能,取决于树的层数和平衡程度。
在这里插入图片描述

BST树的节点

struct Node
{Node* parent;Node* left;Node* right;int val;
}

BST的插入

bool Insert(Node* root,Node* newNode)
{Node* head =nullptr;if(root==nullptr){*root = *newNode;return true;}Node* current = root;while(current!=nullptr){if(newNode->val==current->val) return nullptr;else if(newNode->val>current->val) {if(current->right==nullptr){current->right = newNode;newNode->parent = current;}current = current->right;}else if(newNode->val<current->val){if(current->left==nullptr){current->left = newNode;newNode->parent = current;}current = current->left;}}return head;
}

BST查找

Node* Search(Node* root, int target)
{Node* current = root;while (current != nullptr){if (target == current->val){return current; // 找到目标节点,返回它}else if (target < current->val){current = current->left; // 目标值较小,向左子树查找}else{current = current->right; // 目标值较大,向右子树查找}}return nullptr; // 未找到目标节点
}

BST删除

BST的删除比较复杂,需要先了解二叉树的遍历顺序
《二叉树》

在这里插入图片描述
二叉树的前驱和后继是按中序遍历计算的,L称为前驱,R为后继。
在这里插入图片描述

  1. 如果一个树没有子节点,直接删除
  2. 如果一个树只有一个子节点,删除当前节点并把子节点补到这个位置
  3. 如果有两个子节点 ,操作复杂,进行以下操作
    • 找到被删除的节点的左子树最大值或右子树最小值
    • 我们选中右最小或者选中左最大
    • 我们将这个选中的节点的子树连接在选中的节点的父节点
    • 将选中节点替换到删除节点,并持有被删除节点的左右子树
//查找子树最大值
Node* FindMax(Node* node)
{Node* current = node;while(current!=nullptr){current = current->right;}return current;
}
Node* FindMin(Node* node)
{Node* current = node;while(current!=nullptr){current = current->left;}return current;
}//需要先搜索找出被删除节点的指针
Node* DeleteNode(Node* root,Node* target)
{//删除根节点,返回空指针if(root==target){return nullptr;}//子节点不存在,将当前节点从父节点上移除if(target->left==nullptr&&target->right==nullptr){target->parent = nullptr;}//一个子节点为空,左子节点为空else if(target->left==nullptr){if(target==target->parent->left){target->parent->left = target->right;target->right->parent = target->parent; }else{target->parent->right = target->right;target->right->parent = target->parent;}}else if(target->right==nullptr){if(target==target->parent->right){target->parent->right = target->left;target->left->parent = target->parent;}else{target->parent->left = target->left;target->left->parent = target->parent;}}//两个子节点存在else{//左侧最大,右侧最小值Node* min = FindMin(target->right);//选中的节点的子树连接在选中的节点的父节点min->parent->left = min->left;min->left->parent = min->parent;min->parent->right= min->right;min->right->parent = min->parent;//选中节点置换删除节点if(target->parent->left==target) {target->parent->left=min;min->parent = target->parent;}else {target->parent->right = min;min->parent = target->parent;}//选中节点继承被删除节点的子树min->left = target->left;target->left->parent = min;min->right = target->right;target->right->parent = min;}}

子树和相同树

递归实现的,可能存在爆栈风险,但是一般来讲BST的平均深度不会引起这种问题,可以使用。这里不再给出非递归实现

bool isSubtree(TreeNode* s, TreeNode* t) {if (!s) return false; // 父树为空,不可能有子树if (isSameTree(s, t)) return true; // 当前子树和子树t相同return isSubtree(s->left, t) || isSubtree(s->right, t); // 继续递归检查左右子树
}bool isSameTree(TreeNode* p, TreeNode* q) {if (!p && !q) return true; // 两棵树都为空if (!p || !q) return false; // 一棵树为空,另一棵不为空return p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

BST存在一个非常严重的问题,就是可能出现极端情况,这时BST会退化为一个双链表,导致丧失查找优势。
在这里插入图片描述

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

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

相关文章

qt5.14.2+VS源码调试记录

在对qt使用时&#xff0c;有时需要对源代码进行调试&#xff0c;方便进行问题定位和debug&#xff0c;但直接安装的qt不能进入qt源码&#xff0c;需要进行一定的操作才能进行源码调试和定位。 源码调试需要对应版本的pdb文件&#xff0c;可以在官网下载&#xff0c;也可找其它…

2023年台州市第三届网络安全技能大赛(MISC)—Black Mamba

前言&#xff1a;当时比赛没有做出来现在来复现一下 就当记录一下&#xff08;这个思路没想到&#xff09; Black Mamba&#xff1a; 一张图片 常规得分离&#xff0c;属性&#xff0c;LSB&#xff0c;盲水印等都尝试过 无果&#xff01; 考点&#xff1a;异或解密&#xff0…

Flutter学习笔记

此篇文章用来记录学习Flutter 和 Dart 相关知识 零.Dart基本数据类型 Dart 是一种静态类型的编程语言&#xff0c;它提供了一系列基本数据类型&#xff0c;用于存储和操作不同种类的数据。以下是 Dart 中的一些基本数据类型以及它们的详细介绍&#xff1a; 1. 整数类型&#…

企业服务器租用对性能有什么要求呢?

企业租用服务器租用首要的是稳定&#xff0c;其次是安全&#xff0c;稳定是为了让企业的工作能够顺利进行&#xff0c;只有性能稳定的服务器才能保证网站之类的正常工作&#xff0c;就让小编带大家看一看有什么要求吧&#xff01; 服务器简单介绍。服务器是在网络上为其它客户机…

Unit3 使用 uniCloud 制作书籍管理移动端应用项目

Unit3 使用 uniCloud 制作书籍管理移动端应用项目 1 构建项目并关联云服务空间2 为项目准备数据库表3 schema2Code4 遇到了错误5 对 "addtime" 字段对应的前端组件进行修改6 首次运行 1 构建项目并关联云服务空间 uniCloud 为开发人员提供了“阿里云”和“腾讯云”两…

边坡安全监测系统:守护边坡稳定的重要工具

在工程建设中&#xff0c;边坡安全监测系统一直被认为是掌握边坡安全及其支护结构维护决策系统的关键支撑条件。这一系统的主要目的在于确定边坡结构的稳定性&#xff0c;监控支护结构的承载能力、运营状态和耐久性能&#xff0c;并对边坡稳定性进行实时监控。 一、边坡安全监测…

竞赛选题 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

react-antd 文件导入按钮增加一个加载状态

1、效果图实例: 2、部分代码 2.1 props : 2.2 handleChange、上传的文件检验 : construction中定义 construction(props) { super(props); this.state { loadingStaus: flase, loadingDisabled: flase, // 作用:按钮如果在加 载状态中&#xff0c;没…

Node.js代码漏洞扫描工具介绍——npm audit

npm audit 运行安全检查 主要作用&#xff1a;检查命令将项目中配置的依赖项的描述提交到默认注册中心&#xff0c;并要求报告已知漏洞。如果发现任何漏洞&#xff0c;则将计算影响和适当的补救措施。如果 fix 提供了参数&#xff0c;则将对包树应用补救措施。 具体参考&#x…

【面向校招】Golang 常考面试题汇总 持续更新中...

前言: 为了方便自己复习和巩固,基础知识,整理了这个面试题汇总 文章目录 Go基础1. 讲一讲go中slice底层2. 讲一讲go中Map底层3. 讲一讲go中channel底层4. go中的并发编程MutexMysql1)数据库的三大范式2)关系型数据库和非关系型数据库的优缺点对比,应用场景3)MySQL和Mong…

机器视觉工程师,我们上班的意义在哪里?

很多朋友&#xff0c;现在不是自己想做的工作&#xff0c;那你做这份工作干什么&#xff1f;担心自己没有竞争力&#xff0c;担心自己被替代。上班的意义是完成自己头脑和资源的原始积累&#xff0c;迈向下一级人生游戏;我最终要靠自己本事吃饭&#xff0c;而不是一直待在这个只…

Tensorflow入门之 Hello World

Tensorflow入门之 Hello World 简介 Tensorflow 是 Google 开源的深度学习框架&#xff0c;来自于 Google Brain 研究项目&#xff0c;在 Google 第一代分布式机器学习框架 DistBelief 的基础上发展起来。 Tensorflow 的官方网址 http://www.tensorflow.org Tensorflow 的 G…

Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口&#xff0c;AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 光照强度 100 - 模拟量 / 40;代码&#xff1a; 完整朴素代码&#xff1a; #in…

微信小程序template界面模板导入

我们有些时候 会有一些比较大但并不复杂的界面结构 这个时候 你可以试试这种导入模板的形式 我们在根目录创建一个 template 目录 然后下面创建一个 text文件夹下面创建一个 test.wxml 参考代码如下 <template name"textIndex"><text class "testw&…

Django使用SMTP发送邮件教程

CONTENTS 1. SMTP介绍2. 申请邮箱授权码3. Django发送邮件 1. SMTP介绍 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议&#xff0c;它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。SMTP 协议属于 TCP/I…

Arm64体系架构-MPIDR_EL1寄存器

背景 在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的. 那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPID…

香港Web3.0生态现状

目前香港Web3.0生态正在快速发展。香港政府和金融机构正在积极推动Web3.0生态的建设&#xff0c;以推动数字经济和智慧城市的发展。香港政府已经发布了有关虚拟资产发展的政策宣言&#xff0c;鼓励和监管并重&#xff0c;加大力度推动虚拟资产产业向前发展。同时&#xff0c;香…

E. Monsters

Problem - 1810E - Codeforces 思路&#xff1a;我们总结一下题意&#xff0c;能够得到这个题其实就是让我们从某个0开始搜索&#xff0c;然后看看是否可以遍历所有得节点&#xff0c;那么如果采用暴力得话那就是n^2logn&#xff0c;因为我们遍历一次使用优先队列得话是nlogn的…

ubuntu2204配置仓库为阿里源

官网上支持到2004&#xff0c;2204需要手动更改一下 deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb https://mirrors.aliyun.com/ubuntu/ jam…

如何使用 Dijkstra 算法找到从源到所有顶点的最短路径--附C++/Java源码

给定一个图和图中的源顶点,找到从源到给定图中所有顶点的最短路径。 例子: 输入: src = 0,图形如下图所示。 输出: 0 4 12 19 21 11 9 8 14解释:从 0 到 1 的距离 = 4。 从 0 到 2 的最小距离 = 12。0->1->2 从 0 到 3 的最小距离 = 19。0 ->1-