C++学习笔记(23)——二叉树进阶

系列文章

http://t.csdnimg.cn/QDR3y


目录

  • 系列文章
    • @[TOC](目录)
  • 1. 二叉树的优势
  • 2. 二叉搜索树概念
  • 3. 二叉搜索树操作
    • 1. 二叉搜索树的查找
    • 2. 二叉搜索树的插入——地址链接重设
    • 3. 二叉搜索树的删除——地址链接重设
  • 4. 二叉搜索树的应用——以key为载体,承载复杂信息在搜索树中的搜索优先度。
    • 1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。
    • 2. KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。该种方式在现实生活中非常常见:
  • 5. 二叉搜索树的性能分析

在这里插入图片描述

1. 二叉树的优势

二叉树的核心优势是:低成本实现插入操作

二叉树的数据有序性由地址链接实现,数据在内存空间可以跳跃的存储,使得插入操作实现时只需考虑前后的地址关系;避开了数组存储数据时因为内存空间完全连续存储使得插入新数据时需要挪动大量数据导致低效的致命缺陷。

2. 二叉搜索树概念

二叉搜索树又称二叉排序树或二叉查找树,它或者是一棵空树,或者是具有以下性质的二叉树:

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  3. 它的左右子树也分别为二叉搜索树

在这里插入图片描述

3. 二叉搜索树操作

1. 二叉搜索树的查找

a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
b、最多查找高度次,走到到空,还没找到,这个值不存在。
在这里插入图片描述

2. 二叉搜索树的插入——地址链接重设

插入的具体过程如下:

a. 树为空,则直接新增节点,赋值给root指针
b. 树不空,按二叉搜索树性质查找插入位置,插入新节点

在这里插入图片描述

3. 二叉搜索树的删除——地址链接重设

首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:

a. 要删除的结点无孩子结点
b. 要删除的结点只有左孩子结点
c. 要删除的结点只有右孩子结点
d. 要删除的结点有左、右孩子结点

看起来有待删除节点有4中情况,实际情况a可以与情况b或者c合并起来,因此真正的删除过程如下:
在这里插入图片描述

情况b:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点–直接删除
情况c:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点–直接删除
情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题–替换法删除

4. 二叉搜索树的应用——以key为载体,承载复杂信息在搜索树中的搜索优先度。

1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。

比如:给一个单词word,判断该单词是否拼写正确,具体方式如下:
以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树
在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。

2. KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。该种方式在现实生活中非常常见:

比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;
再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出现次数就是<word, count>就构成一种键值对。

5. 二叉搜索树的性能分析

在这里插入图片描述

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

  1. 最优情况下,二叉搜索树为完全二叉树(或者接近完全二叉树),其平均比较次数为:log_2 N
  2. 最差情况下,二叉搜索树退化为单支树(或者类似单支),其平均比较次数为:\frac{N}{2}
    问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?那么我们后续章节学习的AVL树和红黑树就可以上场了。

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

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

相关文章

在矩池云使用GLM-4的详细指南(无感连GitHubHuggingFace)

GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本&#xff0c;在多项测试中表现出超越已有同等规模开源模型的性能&#xff0c;它能兼顾多轮对话、网页浏览、代码执行、多语言、长文本推理等多种功能&#xff0c;性能更加强大。其多模态语言模型GLM-4V-9B在…

生产环境部署meilisearch(Running a self-hosted Meilisearch project in production)

官网的第一手资料学新技术&#xff1a;meilisearch官方文档 安装的官网地址&#xff1a;meilisearch安装的官网 部署在生产环境的指导&#xff1a;meilisearch部署在生产环境的指导 Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重…

vscode软件上安装 Fitten Code插件及使用

一. 简介 前面几篇文章学习了 Pycharm开发工具上安装 Fitten Code插件&#xff0c;以及 Fitten Code插件的使用。 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省…

Qt5/6使用SqlServer用户连接操作SqlServer数据库

网上下载SQLServer2022express版数据库,这里没啥可说的,随你喜欢,也可以下载Develop版本。安装完后,我们可以直接连接尝试, 不过一般来说,还是下载SQLServer管理工具来连接数据更加方便。 所以直接下载ssms, 我在用的时候,一开始只能用Windows身份登录。 所以首先,我…

前端数据模拟Mock.js

新建mock-demo的项目&#xff0c;安装npm install mockjs 新建index.js //引入mockjs import Mock from mockjs //设置延迟时间 // Mock.setup({ // timeout:4000 // }) //使用mockjs模拟数据 Mock.mock(/product/search,{"ret":0,"data":{"mtim…

金融上云及信创改造过程中的新老设备兼容性、虚拟化多池管理简化、提升故障恢复能力等问题及解决方案|金融行业数字化QA合集②

Q&#xff1a;金融机构如何解决新老设备间的兼容性问题&#xff1f; 我行在虚拟化资源池扩容时&#xff0c;新采购的服务器与原有的服务器存在代差&#xff0c;容易出现新服务器的CPU架构与原有服务器不同&#xff0c;可能导致虚拟机迁移或运行时的性能问题或不兼容&#xff1…

探索Facebook对世界各地文化的影响

随着数字化时代的到来&#xff0c;社交媒体已成为连接世界各地人们的重要平台之一。而在这个领域的巨头之一&#xff0c;Facebook不仅是人们沟通交流的场所&#xff0c;更是一座桥梁&#xff0c;将不同地域、文化的人们联系在一起。本文将探索Facebook对世界各地文化的影响&…

一户一表集中抄表:现代化大都市管理的新模式

1.定义分析 一户一表集中抄表是一种现代化能源管理体系方法&#xff0c;广泛应用于电力工程、供水公司、天然气等行业。这个模式下&#xff0c;每一个用户都有独立的电能表&#xff0c;这种表集中化在一处进行在线数据载入&#xff0c;大大提升了抄水表效率精确性。用这种方式…

如何挑选靠谱的软件开发公司?

在数字化的大潮中&#xff0c;企业商家都明白一个道理&#xff1a;没有一艘强大的软件开发公司“战舰”&#xff0c;想在商海中乘风破浪可不容易。但问题是&#xff0c;市场上那么多软件开发公司&#xff0c;如何挑选出最靠谱的那一家呢&#xff1f;别急&#xff0c;这篇文章就…

今日成果2024-6-7 TrustZone TEE安全SDK开发指南

Rockchip Vendor Storage Application Note.pdf OK 开机下&#xff0c;可以实现Vendor Storage的读写。 0ms时同步RTC时间 OK Rockchip_Developer_Guide_TEE_SDK_CN.pdf 什么是TrustZone 此系统方法意味着可以保护安全内存、加密块、键盘和屏幕等外设&#xff0c;从而可确…

嵌入式学习(二)——c51单片机(1)

使用keil软件 同时安装CH340驱动 将变成好的文件存成 .hex 交替闪烁代码 #include "reg51.h"void delay(unsigned int n) { while(n) { --n; } }int main(void) { while(1) { P20x00; delay(20000); P20xff; delay(20000); } return 0; } 让指定的灯亮 #includ…

全网爆火【MBTI人格测试】是如何实现的?

功能介绍 概述 MBTI人格测试是一款基于Agent Builder框架开发的智能体应用&#xff0c;旨在通过五个精心设计的问题准确分析用户的MBTI性格类型。完成测试后&#xff0c;应用将提供详细的性格分析和建议&#xff0c;帮助用户更好地理解自己的性格特点。 功能详述 1. MBTI测试…

ATFX汇市:非农数据超预期靓丽,美指重新站上105关口

ATFX汇市&#xff1a;6月7日&#xff0c;美国劳工统计局公布5月份非农就业报告&#xff0c;其中提到&#xff1a;5月份增加了27.2万个岗位&#xff0c;大幅高于前值16.5万人&#xff0c;数据超预期靓丽&#xff1b;几个行业的就业人数继续呈上升趋势&#xff0c;其中医疗领域增…

RawChat:优化AI对话体验,全面兼容GPT功能平台

文章目录 一、Rawchat简介1.1 RawChat的主要特性1.2 RawChat的技术原理简述 二、使用教程三、案例应用3.1 图片内容分析3.2 生图演示3.3 文档解析3.4 探索更多 四、小结 一、Rawchat简介 RawChat平台的诞生&#xff0c;其核心理念是降低用户访问类似ChatGPT这类先进AI服务的门…

linux本地搭建dns

不需要图形化界面 使用的是dnsmasq&#xff0c;配置简单 1.安装 deb系列linux apt-get install dnsmasqrhat系列linux yum install dnsmasq2.编辑配置文件 vi /etc/dnsmasq.conf设置主dns服务器&#xff0c;比如现有公用的的114.114.114.114 8.8.8.8这类的 server8.8.8.8…

go匿名函数

【1】Go支持匿名函数&#xff0c;如果我们某个函数只是希望使用一次&#xff0c;可以考虑使用匿名函数 【2】匿名函数使用方式&#xff1a; &#xff08;1&#xff09;在定义匿名函数时就直接调用&#xff0c;这种方式匿名函数只能调用一次&#xff08;用的多&#xff09; &am…

flutter 环境搭建(windows)(先装 jdk 建议1.8起步)

1&#xff1a;先从 官网 下载一个合适版本的SDK 2&#xff1a;下载完成之后 解压到一个合适的盘符下面&#xff08;本文在 D 盘 3.10.0版本&#xff09; 3&#xff1b;双击 flutter_console.bat文件可以看到一些基本信息 4&#xff1a;配置环境 1.添加用户变量 FLUTTER_STORAGE…

CAN转PROFINET,轻松实现降本增效!AGV行业必备连接通信方案大揭秘!

随着工厂自动化发展以及柔性制造系统、自动化立体仓库的广泛应用&#xff0c;已作为管理离散型装配、物流、仓储等系统不可或缺的自动化搬运装卸工具&#xff0c;智能化AGV系统可根据ERP订单进行仓库配料、分料、产品装配以及出入库、包装物流等环节。 AGV由导航系统、传感器系…

【IoT NTN】3GPP R18中关于各类IoT设备在NTN中的增强和扩展

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

C语言结构体和共用体

1.结构体变量的内存分配(结构体的大小) struct node{char a;int b;char c; };(1)结构体的各成员变量的内存布局问题 a.以定义时各成员变量出现的次序&#xff0c;依次保存。 b.结构体的大小需要地址对齐&#xff08;结构体中每个成员变量在内存中的存放位置需要对齐&#xff0…