后序线索树怎样画图_算法新解刘新宇(二)二叉搜索树:数据结构中的“hello world”...

二叉搜索树BST定义:

基于广义二叉树,一颗二叉树定义:或者为空 或者包含三部分:一个值,一个左分支和一个右分支。这两个分支也都是二叉树分支。一颗二叉搜索树是满足下面条件的二叉树:所有左分支的值都小于本节点的值;本节点的值小于所有右分支的值;所以这也代表了BST中的value应当是能够进行大小比较的。

数据结构表示:

通过链表进行表示时,会分为两大部分:value区与索引区:索引区分为left right两个区域,自己实现在某些情况下能够用上parent;value是树中所保存的关键信息;

对于BST书上讲解了四种操作:插入 遍历 搜索 删除

插入:

我们可以使用下面的算法向一颗二叉搜索树插入一个键K:

 如果树为空,创建一个叶子节点,令该节点的key = k; 如果k小于根节点的key,将它插入到左子树中; 如果k大于根节点的key,将它插入到右子树中。

存在一个特殊情况,当k等于根节点的key时,说明已经存在。这个时候可以按照具体需求来操作:如重写数据或者忽略。

插入算法是递归或者递推实现的,可以尝试一下。

遍历:

前序遍历 中序遍历 后续遍历

BST的中序遍历是最有特点的。对BST进行中序遍历,元素会按照从小到大的顺序输出,这个是由二叉搜索树的定义决定的。

遍历这个问题可以先通过递归的方式简单进行实现,理解它的定义。实现后通过递推的方式进行实现,对个人的帮助较大。先序遍历 中序遍历可以通过一个栈空间辅助实现。后序遍历会稍微复杂些,也是通过栈实现,其中的元素需要有一个标志位,确定访问次数,确保左右子树均访问后才能将该节点出栈。

搜索:

二叉搜索树有三种搜索:在树中查找一个key,查找最大或最小的元素;查找给定元素的前驱或者后继。

二叉搜索树非常适合进行元素的查找:

如果树为空,查找失败;如果根节点的key等于查找值,查找成功,返回根节点作为结果;如果待查找的值小于根节点的key,继续在左子树中递归查找;如果待查找的值大于根节点的key,继续在右子树中递归查找;

最小元素和最大元素

利用最小元素在树的最左边,最大元素在树的最右边的特性进行查找;

前驱与后继——>容易让人联想到二叉线索树

在实际使用一些数据结构的时候,前驱和后继意义较大。值得研究一下。

删除一个元素

不用真实的删除,单纯的用一个标记位进行标记?

或者通过递归的方式进行删除

22a2538100519cffd4ae18fe04228415.png

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

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

相关文章

写代码的三原则

1.不要急于调试,应戒急用忍 不要写一点功能,就Run一下查看效果,这样的做法,源于对自己的不自信。 应该尽量按照思路一直写到,不进行测试,就无法进行下去时候为止。 因为,每次运行程序都要浪费一…

Android 亮屏速度分析总结

前面聊的 最近在调试项目的亮屏速度,我们希望在按下power键后到亮屏这个时间能达到500MS以内,在Rockchip 3399和3288上面的时间都不能达到要求,因此引发了一系列的调试之路。 计算按下power键到亮屏的时间 Android 唤醒时间统计 刚开始的时…

英语学习中总结的阅读、段落匹配、选词填空技巧

1 阅读题 一般五道题都是围绕主旨来问的,所以后四个问题也能帮助第一题的解答,找共有词~~~串起来 文章一般都是新旧观点的碰撞,所以有时候他问的是旧观点,要看清楚他问的是新观点还是旧观点,这是个陷阱~ 2 段落匹配 反…

sql 账号查询一个表查询权限_一个查询语句引发的问题以及巨型表相关操作探索与思考...

背景:关于这个标题想了试了好几个总觉得欠那么点意思。大致情况是,在某服务支持中,1张大表4.5T左右,该表也是分区表。其中一个执行频繁的SQL写法有很大问题,导致巨表全量扫描,造成IO负载很大,业…

Android 亮屏速度分析

前面聊的最近在调试项目的亮屏速度,我们希望在按下power键后到亮屏这个时间能达到500MS以内,在Rockchip 3399和3288上面的时间都不能达到要求,因此引发了一系列的调试之路。计算按下power键到亮屏的时间Android 唤醒时间统计刚开始的时候&…

Linux中一些 不是很常用的配置修改

1,让虚拟机屏幕最大化 :查看-->自动调整大小-->自动适应客户机 2,让虚拟机取消屏保: system --> preferences --> Screensaver转载于:https://www.cnblogs.com/aiyr/p/6713579.html

python 怎么拷贝一个文件到一个新的文件_Python脚本提取不同文件夹里面的文件到一个新的文件...

这条博客分享一个脚本,实现将不同文件夹的我们需要的文件提取到一个新的文件下。如:这是原来文件下的文件,我将它重新命名,然后复制到下图的文件夹下,实现将很多不同文件夹下很多我们想要的文件提取出来,省…

container_of实例

1 前面说的 container_of 在linux内核代码里面使用非常多,对于喜欢linux编程的同学来说,对这个函数要非常清楚他的使用方法,而且还要知道他的原理,这对以后看内核代码,写内核驱动的帮助都非常大,当然&…

Git 分布式版本控制工具 03Git常用命令:Git全局设置+本地与远程仓库操作获取Git仓库+标签操作+忽略名单+工作区、暂存区、版本库+分支操作+暂时保存

Git常用命令目录4 Git常用命令4.1 Git全局设置4.2 获取Git仓库4.2.1 在本地初始化Git仓库4.2.2 从远程仓库克隆4.3 常见的概念:工作区、暂存区、版本库4.4 常见的概念:Git工作区中文件的状态4.5 本地仓库操作4.5.1 git status4.5.2 git add4.5.3 git res…

css属性

CSS属性 字体属性: (font) 大小 font-size: x-large;(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以. 单位:PX、PD 样式 font-style: oblique;(偏斜体) italic;(斜体) normal;(正常) 行高 line-height: normal;(正常) 单位&…

matlab dir函数_MATLAB自动管理文件

MATLAB自动管理文件1. MATLAB中路径设置(1)cd:用于切换当前工作目录示例:将当前工作目录切换到D:\Documents\MATLAB\Matlab test\study下。代码:cd (D:\Documents\MATLAB\Matlab test\study)(2)path:用于对搜索路径的操作示例:先查看当前所有的文件路径&…

git上传大于100M的文件

错误日志 Git lfs - “this exceeds GitHub’s file size limit of 100.00 MB” 解决办法 看这个网址 https://git-lfs.github.com/ 下载上面的后,然后使用下面的命令使用 git lfs install 上面下载而已,并没有安装 git lfs track “*.rar” 这个是要…

Git 分布式版本控制工具 04Gitcode案例:多人协作开发流程+创建仓库+拉取操作+克隆仓库+拉取远程仓库中最新的版本+修改拉取的本地代码

文章目录5. Gitcode5.1 多人协作开发流程5.2 创建仓库5.3 拉取操作5.3.1 克隆仓库5.3.2 拉取远程仓库中最新的版本5.4 修改拉取的本地代码5.5 解决冲突5.6 跨团队协作5. Gitcode 在版本控制系统中,大约90%的操作都是在本地仓库中进行的:暂存&#xff0c…

XHTML结构化

XHTML 规则概要 将传统的 HTML 转换为 XHTML 1.0 是快捷且无痛的,只要你遵守一些简单的规则和容易的方针。不管是否使用过 HTML,都不会妨碍你使用 XHTML。 使用恰当的文档类型声明和命名空间。使用 meta 元素声明你的内容类型。使用小写字母书写所有的元…

rabbitmq如何保证消息不被重复消费_如何保证消息不被重复消费

一. 重复消息为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。1.1 生产时消息重复由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经…

JavaScript RegExp 对象

// 1 创建正则表达式两种方式 // 1.1 用new // 第1个参数模式是必须的 第2个模式修饰符参数可选 // i:忽略大小写 g:全局匹配 m:多行匹配 var box new RegExp(Box); var box new RegExp(Box, gim);// 1.2 用字面量的形式 // 两个反斜杠是正则表达式的字面量表示形成 var box …

Git 分布式版本控制工具 06在IDEA中使用Git:获取Git仓库+本地仓库操作+远程仓库操作+创建/查看/切换/推送/合并分支操作

在IDEA中使用Git7. 在IDEA中使用Git7.1 在IDEA中配置Git7.2 获取Git仓库7.2.1 本地初始化仓库7.2.2 从远程仓库克隆7.3 Git忽略文件7.4 本地仓库操作7.4.1 将文件加入暂存区7.4.2 将暂存区文件提交到版本库7.4.3 查看日志7.5 远程仓库操作7.5.1 查看远程仓库7.5.2 添加远程仓库…

linux 内核宏container_of剖析

1、前面说的我在好几年前读linux 驱动代码的时候看到这个宏,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解。container_of宏 在linux内核代码里面使用次数非常非常多,对于喜欢linux编程的同学来说,了解其…

目录树 删除 数据结构_数据结构:B树和B+树的插入、删除图文详解

B树1.1B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。一颗m阶的B树定义如下:1)每个结点最…

MMdetection框架速成系列 第01部分:学习路线图与步骤+优先学习的两个目标检测模型代码+loss计算流程+遇到问题如何求助+Anaconda3下的安装教程(mmdet+mmdet3d)

mmdetection 学习目录1 mmdetection 学习建议1.1 mmdetection 学习的第一件事1.2 mmdetection学习路线图1.2.1 优先看的两个库1.2.2 阅读代码1.2.3 代码学习步骤1.2.4 建议优先学习的两个目标检测模型代码1.2.5 loss计算流程的攻坚克难1.3 遇到问题如何求助2 Anaconda3下的安装…