前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构里的一棵树

数据结构里的一棵树

作者头像
WindWant
发布于 2024-01-13 02:41:38
发布于 2024-01-13 02:41:38
1700
举报
文章被收录于专栏:后端码事后端码事

一、树是什么?

有根有枝叶便是树!根只有一个,枝叶可以有,也可以没有,可以有一个,也可以有很多。

就像这样:

嗯,应该是这样:

二、一些概念

1、高度

树有多高,嗯,我一米八三!

树的高度怎么算?

高度是啥,就是从下往上到最顶端,从叶节点到根节点。

从每个叶节点开始,一个节点一个节点往上数,数到根节点,最长的那个数就是数的高度。叶节点起始为0.

上面这个树的高度是4。

2、深度

深度,顾名思义,就是从上往下到最低端,从根节点到叶节点。

从根开始,一个节点一个节点往下数,数到每个叶子节点,最长的那个数就是数的深度。根节点的起始为0.

上面这个树的深度是4。

对比上面的高度,看到了哈,数值是一样的,

3、层

一层是什么呢。就是横向的同一高度的所有节点凑一块儿就是一层。

像下面一条线连接了第二层所有的节点:

三、二叉树的遍历

二叉树是什么?

二叉树就是每个节点最多有两个分叉子节点。

遍历是什么意思?

遍历就是一个树的所有节点都点一遍,那么既然要点一遍,总归要遵循一个特定的顺序,不然,乱来的话总会可能漏一个,或者多一个。

像下面这棵树:

1、前序遍历

顺序:中左右

中 6 -> 左中 5 -> 左 2 -> 右 3 -> 右中 7 -> 右 8

结果就是:6、5、2、3、7、8。

2、中序遍历

顺序:左中右

左 2 -> 中 5 -> 右 3 -> 中 6 -> 右中 7 -> 右 8

结果就是: 2、5、3、6、7、8。

3、后序遍历

顺序:左右中

左 2 -> 右 3 -> 中左 5 -> 右 8 -> 中右 7 -> 中 6

结果就是:2、3、5、8、7、6.

这个顺序,其实很容易混乱。想要记得牢,只需要一点:

【前、中、后】,前为左,右为后,哪个顺序遍历,那么哪个节点就会顺序居中,其它的节点,靠左的居前。

节点的巡查是从根节点出发,从上到下,从左至右巡查,每个节点及其子点巡查完毕后,再跳出到其它节点。

4、附加:层序遍历

层序遍历很简单就是从上到下,一层一层的收拢节点。

第一层 6 -> 第二层 5、7 -> 第三层 2、3、8

结果就是:6、5、7、2、3、8.

4、树能干什么?

树能盖房子!

没错,树通常用来搭建存储数据的房子。

数据存储是对数据的持久化保存,针对数据的操作包括读和写。不过,无论是读还是写,都离不开对数据的检索操作。

1、B树

之前文章介绍过B树及在数据库存储方面的应用:

你好,我是B树

MySQL InnoDB 是怎么使用 B+ 树存数据的?

B 树,即balance tree。其结构及节点数据分布遵循特定的规则。

B 树的算法运行时间通常由它所执行的【磁盘读写操作次数】决定,所有一般会一次尽可能的读写更多的信息。一个B树节点通常和一个完整的磁盘页大小相同,所以磁盘页的大小限制了一个B树节点所能包含孩子节点的个数。

B 树每个节点会包含多少个分支,称之为分支因子。分支因子越大,B 的高度越低,查找关键字所需的磁盘存取次数越少,查询时间越短。这也是为什么会推崇使用B树结构来作为数据底层存储。

2、二叉搜索树

二叉搜索树是以一棵二叉树来组织数据存储,每个节点除了包含数据本身外,还包括指向左节点、右节点及父节点的指针,即key、left、right、p。其中存储数据需满足左中右非降序存储,即left.key <= key <= right.key。

左中右,是不是很熟悉,就是我们上面讲到过的【中序遍历】顺序。【中序遍历】输出的话,整个数列会是非降序排序数列。

搜索树结构通常支持包括查找,最大值,最小值,插入,删除等操作。嗯,这些操作是不是又很熟悉,总之就是一个【日常操作】。

二叉搜索树上的操作时间和它的高度成正比,对于n节点二叉树,通常最坏运行时间为O(lgn)(为什么是O(lgn)呢?这个需要推导,先记住就行了),这个就是树元素随机分步的情况下的结果。极端情况下,一条链从根到叶的话,时间固定就是O(n)了。就像下面这个棵树:

3、红黑树

红黑树也是一个二叉搜索树。那为什么会需要这么一棵树呢?

就是为了避免上面哪种极端或者接近极端情况的出现。它可以【保证最坏的情况下操作时间复杂度为O(lgn)】。

对的,是保证!那怎么保证呢?当然是通过维持红黑树本身的结构特点来实现。

我们上面及到过二叉搜索树节点包含的数据,红黑树会在其基础上增加一个存储位来表示节点的颜色(红或者黑)。通过【对任何一条从根到叶子节点的简单路径上的各个节点颜色进行约束】来确保【没有一路径会比其它路径长2倍】。

红黑树的特点:

  • a)【节点要么红,要么黑】
  • b)【根节点是黑的】
  • c)【叶节点是黑的】
  • d)【如果一个节点是红色的,那么它的子节点是黑色的】
  • e)【对任何一个节点,从该节点到其所有后代叶节点的简单路径上的黑节点数据是相同的】

这里有个点需要强调一下,红黑树里所说的叶子节点指的是【外部节点】,也就是不包含 key 的节点。

黑高:从某个节点到达其叶节点的【任何一个(参考e】简单路径上的黑色节点个数称之为黑高。红黑树的黑高即为其根节点的黑高。

一颗有 n 个内部节点的红黑树的高度至多为 2lg(n+1),也即我们前面说的能够保证最坏的情况下操作时间复杂度为O(lgn)。

红黑树有哪些应用呢?

最常见的就是 HashMap了,用于解决存储元素哈希冲突,当链表元素个数超过8时,即转为红黑树。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小程序系列之禁用视频快进
小程序已经提供了强大的各种API,基本能满足大多场景下的使用,然而,客户的想法总是那么猝不及防,看起来又是那么的合理··· 比如:学习网站的一个任务,学习视频必须一分一秒的全部看完才算完成任务。但是小程序的视频播放又带有快进功能,此时有两种方案:
小尘哥
2020/08/05
6K0
小程序系列之禁用视频快进
小程序----video视频播放
Video小程序播放视频的组件。 Video组件 wx.createVideoContext(videoId, this)创建并返回 video 上下文 videoContext 对象。在自定义组
honey缘木鱼
2018/06/13
3.5K0
如何使用小程序媒体组件
图片,视频,音乐是小程序使用中不可缺少的部分,这篇文章中,我们将介绍小程序媒体组件的使用。媒体组件分为audio音频组件,image图像组件,video视频组件,camera相机组件以及live-player、live-pusher小程序直播组件。其中直播权限需要相关资质的账号才能开通,本文暂不做介绍。其他组件我们将会以Hello World的demo形式做介绍。
a563831029
2018/11/07
4.9K0
如何使用小程序媒体组件
微信小程序添加音乐组件
audio音频组件 一、简单示例 wxml <audio src="/assets/img/许嵩 - 有何不可.mp3" loop="true" controls="true" name="有何不可" author="许嵩" poster="/assets/img/许嵩.png"></audio> 效果 二、官方示例 wxml <!-- audio.wxml --> <audio poster="{{poster}}" name="{{name}}" author="{{author}}" src="
江一铭
2022/06/16
1.5K0
微信小程序添加音乐组件
「小程序JAVA实战」小程序视频组件与api介绍(51)
如果想在video组件上添加组件,可以使用cover-view组件,具体使用方法点击这里:https://mp.weixin.qq.com/debug/wxadoc/dev/component/cover-view.html。
IT架构圈
2019/01/24
9770
「小程序JAVA实战」小程序视频组件与api介绍(51)
微信小程序视频基本操作
  小程序提供了wx.createVideoContext(string id,Object this)、wx.chooseVideo(Object object)、wx.saveVideoToPhotosAlbum(Object object)等接口对手机视频进行操作。
别团等shy哥发育
2023/02/25
2.8K0
微信小程序视频基本操作
微信小程序添加视频组件
video组件 一、示例: wxml <View>1.播放网络视频</View> <view > <video style="width: 100%;height=400px;margin:1px;
江一铭
2022/06/16
3K0
微信小程序添加视频组件
微信小程序录音与音频播放控制功能
  小程序继承了微信强大的语音处理功能,提供了录音、音频播放控制和背景音乐等功能,它们的功能不同,但有相似性。
别团等shy哥发育
2023/02/25
5K0
微信小程序录音与音频播放控制功能
微信小程序官方组件展示之媒体组件audio源码
以下将展示微信小程序之媒体组件audio源码官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。
软件事业部
2022/09/29
5730
【愚公系列】2022年03月 微信小程序-音频文件
文章目录 前言 一、音频文件 1.旧版 2.新版 ---- 前言 audio 属性 类型 默认值 必填 说明 最低版本 id string 否 audio 组件的唯一标识符 1.0.0 src string 否 要播放音频的资源地址 1.0.0 loop boolean false 否 是否循环播放 1.0.0 controls boolean false 否 是否显示默认控件 1.0.0 poster string 否 默认控件上的音频封面的图片资源地址,如果 controls 属性值为 false
愚公搬代码
2022/12/01
6050
【愚公系列】2022年03月 微信小程序-音频文件
微信小程序Video组件实现视频、自定义播放按钮、封面图、封面图文字demo
在video标签中添加view或cover-view标签,封面图可直接设置video组件的poster属性,自定义按钮和封面图文字包在view中设置定位即可,给自定义按钮绑定点击事件,触发事件后隐藏最外层view,给video绑定bindended事件 设置最外层view显示
peng_tianyu
2022/12/15
3.1K0
微信小程序Video组件实现视频、自定义播放按钮、封面图、封面图文字demo
【愚公系列】2022年04月 微信小程序-视频播放
文章目录 前言 一、视频播放 1.js代码 2.wxml代码 3.WXSS 4.效果 ---- 前言 video视频播放相关属性: 属性 类型 默认值 必填 说明 最低版本 src string 是 要播放视频的资源地址,支持网络路径、本地临时路径、云文件ID(2.3.0) 1.0.0 duration number 否 指定视频时长 1.1.0 controls boolean true 否 是否显示默认播放控件(播放/暂停按钮、播放进度、时间) 1.0.0 danmu-list Array. 否
愚公搬代码
2022/12/01
1.7K0
【愚公系列】2022年04月 微信小程序-视频播放
你的心事我全知晓——心情日记小程序丨实战
1、通过wx.createInnerAudioContext()获取实例 ,安卓机上音乐能正常播放,IOS上不行,具体原因感兴趣的可以去深究一下;
腾讯云开发TCB
2019/08/14
7130
微信小程序官方组件展示之媒体组件video源码
以下将展示微信小程序之媒体组件video源码官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。
软件事业部
2022/10/19
8640
微信小程序开发之(表单组件的使用)代码篇
内容包括添加视频播放、轮转图片、多选框、单选框、实时获取输入值、按钮提交输入控件的数据
全栈程序员站长
2022/09/13
9880
微信小程序开发之(表单组件的使用)代码篇
全栈开发工程师微信小程序-中
每个open-type都有默认的url属性,open-type为navigateBack时,url无效,delta的属性表示为反退,默认是1.
达达前端
2019/07/03
9030
全栈开发工程师微信小程序-中
“小”程序(1)
当一个吝啬的甲方提出,想做一款“很简单的”app。那么你可以劝他,不如做个小程序。这种情况下,无需养多两个大前端(ios和安卓),一个微信就能解决绝大多数的适配表现。另外,站在微信这个高频应用的肩膀上,你的小程序完全可以走得很远。所以当人说起"web前端的春天",一定会拿小程序作为例子。
一粒小麦
2019/08/20
6260
“小”程序(1)
【uniapp】视频分享预览小程序
六一收到个不同以往的需求,我的指导老师最近有点忙,让我们帮忙做一个可以通过二维码预览视频的小程序
德宏大魔王
2023/08/08
3480
【uniapp】视频分享预览小程序
「小程序JAVA实战」小程序视频播放的时候生命周期的控制(56)
当播放单个视频时,点击搜索,视频还在后台继续播放,这是有问题,需要通过生命周期的方式来控制,当跳转页面时,视频暂停播放,视频返回后继续播放。源码https://github.com/limingios
IT架构圈
2019/01/24
6760
「小程序JAVA实战」小程序视频播放的时候生命周期的控制(56)
【愚公系列】2022年09月 微信小程序-实现直播功能
目前短视频直播在当下是非常好的一个职业,而且对应的直播平台也很多,比如抖音,微视,虎牙等等,因为疫情现在很多人无法办工,在家里如果有这个直播系统的帮助能很好地运用做好短视频内容后就要做好粉丝互动这一块,因为点赞评论的数量越多,给我们带来的流量肯定也不会少,还可以把自己的短视频作品转发给朋友,让其点赞评论给自己增加气氛,这样还能带来一些精准的粉丝流量,给自己增加额外的收入。
愚公搬代码
2022/09/28
1.1K0
【愚公系列】2022年09月 微信小程序-实现直播功能
推荐阅读
相关推荐
小程序系列之禁用视频快进
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档