C++:二叉搜索树(binary search tree)

news2024/11/26 14:39:44

目录

1: 二叉搜索树概念

2:二叉搜索树操作

3:二叉树的模拟实现

 4:二叉搜索树的应用

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

6:复习前中后序遍历

7:二叉树进阶面试题


1: 二叉搜索树概念

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

        a:左子树(!=nullptr)中所有节点的值 < 根节点的值 < 右子树(!=nullptr)中所有节点的值。

        b:它的左右子树也分别为二叉搜索树

  

2:二叉搜索树操作

7.4   二叉搜索树 - Hello 算法 (hello-algo.com)icon-default.png?t=N7T8https://www.hello-algo.com/chapter_tree/binary_search_tree/

int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};

1. 二叉搜索树的查找

        a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。

        b、最多查找高度次,走到到空,还没找到,这个值不存在。

2. 二叉搜索树的插入插入的具体过程如下

        a. 树为空,则直接新增节点,赋值给root指针

        b. 树不空,按二叉搜索树性质查找插入位置,插入新节点

3. 二叉搜索树的删除

        首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:(除了根节点之外删除节点前一定要保留该节点是双亲节点的左右子树

        a. 要删除的结点无孩子结点

        b. 要删除的结点只有左孩子结点

        c. 要删除的结点只有右孩子结点

        d. 要删除的结点有左、右孩子结点

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

        情况b:删除该结点 且 使被删除节点的双亲结点 指向被删除节点的左孩子结点 -> 直接删除

        情况c:删除该结点 且 使被删除节点的双亲结点 指向被删除结点的右孩子结点 -> 直接删除

        情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),或者,左子树中寻找中序下的最后一个节点(关键码最大),用它的值填补到被删除节点中,再来处理该结点的删除问题 -> 替换法删除 

3:二叉树的模拟实现

 完整模拟实现代码我已经放在我的gitee里了,有兴趣的老铁可以看看

BinarySearchTree · XiangChao/CPlusPlus - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/RuofengMao/cplusplus/tree/master/BinarySearchTree

 4:二叉搜索树的应用

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

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

        a:假设我们有一个整数集合 {10, 5, 15, 3, 8, 20},我们可以构建一个 K模型的二叉搜索树:

        b:假设我们有一个映射关系,如下所示:        

        Key: "name", Value: "Alice"  、Key: "age", Value: 30、Key: "city", Value: "New York"

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

         插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

         对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。

但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

         最优情况下: 二叉搜索树为完全二叉树(接近完全二叉树),其平均比较次数为:O(\log N)

         最差情况下: 二叉搜索树退化为单支树(或者类似单支),其平均比较次数为:O(N)

        问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?AVL树 红黑树 就可以上场了。

6:复习前中后序遍历

 

 

        看着这三个动画演示,根本就不需要去记,一看就懂(这里感谢动画作者)!!!!

7:二叉树进阶面试题

解题来自出题官方

606. 根据二叉树创建字符串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/construct-string-from-binary-tree/description/

!!!
102. 二叉树的层序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal/description/


107. 二叉树的层序遍历 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/

 和上一题一样,结果数组反转就可以了!!!

 236. 二叉树的最近公共祖先 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/

 !!!二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&&tqId=11179&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

 

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/


106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/

原理同上
144. 二叉树的前序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

94. 二叉树的中序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-inorder-traversal/description/ 145. 二叉树的后序遍历 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

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

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

相关文章

基于协同过滤算法的体育商品推荐系统_t81xg

TOC springboot618基于协同过滤算法的体育商品推荐系统_t81xg--论文 绪 论 近年来&#xff0c;随着互联网科技的进步和发展&#xff0c;人们的生活水平得到了极大的提高&#xff0c;图书的数量也在快速增加&#xff0c;以至于体育商品推荐的数量不断扩大&#xff0c;管理个性…

嵌入式学习——(Linux高级编程——线程)

线程 一、pthread 线程概述 pthread&#xff08;POSIX threads&#xff09;是一种用于在程序中实现多线程的编程接口。它与进程一样&#xff0c;可以用于实现并发执行任务&#xff0c;但与进程相比有一些不同的特点。 二、优点 1. 比多进程节省资源&#xff1a;进程在创建时…

如何用Java SpringBoot+Vue搭建太原学院商铺管理系统【实战教程】

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【中项第三版】系统集成项目管理工程师 | 第 12 章 执行过程组

前言 本章属于10大管理的内容&#xff0c;上午题预计会考8-10分&#xff0c;下午案例分析也会进行考查。学习要以教材为主。 目录 12.1 指导与管理项目工作 12.1.1 主要输入 12.1.2 主要输出 12.2 管理项目知识 12.2.1 主要输入 12.2.2 主要输出 12.3 管理质量 12.3.…

新160个crackme - 037-fireworx.2

运行分析 图标是火炬&#xff0c;估计是Delphi程序&#xff0c;需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 - ida找到关键字符串&#xff0c;双击进入 ida动态调试&#xff0c;LStrCatN是一个拼接函数Serial v10 Name …

兴顺物流管理系统pf

TOC springboot539兴顺物流管理系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff…

VAuditDemo审计之安装教学

目录 Xampp安装VAditDemo 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步&#xff1a; 第六步&#xff1a; 第七步&#xff1a; 第八步&#xff1a; Xampp安装VAditDemo 第一步&#xff1a; 解压VAuditDemo 先上传好zip文件…

PL3322B 升级为PC3322C

PL3322C 是一款高效率、高集成度、原边调节的电源驱动芯片&#xff0c;PL3322C可去除光耦以及次级控制电路&#xff0c;简化了充电器/适配器等传统的恒流/恒压的设计&#xff0c;高精度的电压和电流调节。PL3322C提供SOT23-6封装&#xff1b;PL3322C集成多种保护功能&#xff0…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同&#xff0c; 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的&#xff0c;所以在高版本上安装会有很多报错。 这是我安装后的示例&#xff0c;需要安装教程或者改代码可私信我。 …

工程技术研究杂志工程技术研究杂志社工程技术研究编辑部2024年第12期目录

工程前沿 基于Midas Civil的钢结构人行天桥荷载试验和承载力评价 陈新祥;刘欣;吕美忠; 1-5 基于价值工程理论的基坑支护方案优选 王晓毅;吴军杰; 6-8 建筑工程桩基检测中存在的问题及优化策略研究 张旭;李德君; 9-11 挤密桩参数对黄土地基加固效果的影响研究 杨…

开源介绍 - html2canvas

What is html2canvas &#xff1f; The script allows you to take “screenshots” of webpages or parts of it, directly on the users browser. The screenshot is based on the DOM and as such may not be 100% accurate to the real representation as it does not mak…

Java 入门指南:集合概述

Java集合概述 Java 集合&#xff08;Collections&#xff09;是 Java 中提供的一种容器&#xff0c;用于存储和管理多个对象。与数组不同&#xff0c;集合的长度是可变的&#xff0c;且只能存储对象&#xff08;包括对象的引用&#xff09;&#xff0c;不能存储基本数据类型。…

jmeter中导入java方法并使用

1、首先打开idea&#xff0c;在idea中点击File-New-Project ,创建一个项目&#xff0c;项目名为JmtOne 2、项目创建完成后&#xff0c;直接在main函数中定义两个方法&#xff0c;记住该主函数的包名跟类名&#xff0c;后面会用到&#xff0c;在类中定义了两种拆分字符串的方法&…

FLUX.1 当前支持FLUX.1的Lora模型

首先&#xff0c;我们来梳理一下本次Xlabs-AI团队放出的七款Lora模型&#xff0c;分别是 写实、Furry&#xff08;但是目前该模型还不支持ComfyUI&#xff09;、MJV6、动漫、迪斯尼、风景和艺术风格。每种模型都经过精心训练&#xff0c;能够为 Flux 模型带来卓越的风格转换能…

嵌入式day31

mplayer项目问题分析&#xff1a; 知识短时间内可以获取到 能力的提升一定需要练习 IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 共享内存&#xff1a; 1.是一块 内核预留的空间 2.最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 操作&#xff1a; …

第三方软件测评机构进行安全测试的好处

根据报告显示&#xff0c;2023年全球因网络安全事件造成的损失是8万亿美元&#xff0c;其中70%是由于软件漏洞引起的。这一数据足以表明&#xff0c;企业在软件开发过程中必须重视安全测试。软件安全测试不仅是对软件质量的保障&#xff0c;更是对用户信息和财务安全的保护。 …

QT事件机制理解

事件和信号 从硬件层来看: 事件就是一种中断&#xff0c; 中断的产生形式: 1.用户操控硬件所产生的中断。 2.由系统自身所产生的中断&#xff0c;比如说定时器。 这种中断由系统内核监控&#xff0c;由系统内核接收到中断并向CPU发出的执行请求就叫信号。所以说事件是信号产生…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 06容器网络

本章将回答以下问题 Linux上可用的容器网络组件有哪此?各种选择的限制和性能特征是什么? 命令空间 命名空间是一个 Linux 内核虚拟化组件。该组件类似 Linux 内核提供的网络和服务器虚拟化的组件。命名空间对内核管理的特定的资源进行虚拟化&#xff0c;允许一个虚拟资源有…

Moodle与ONLYOFFICE集成如何实现智能教学管理

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;ONLYOFFICE相信大家已经有所了解&#xff0c;本篇讲一下如…

2024年10月湖北省自学考试报名流程(5步)

2024年10月湖北省自学考试报名流程&#xff08;5步&#xff09; #自学考试 #自考报名 #湖北自考 #湖北自考本科 #湖北自考报名 #湖北自考专科 #湖北省自学考试