php树形数据结构是什么,数据结构 之 树

概述

树的章节一般分两大部分: 一部分将树,一部分将二叉树;虽然二叉树也是树,但是二叉树足够特殊,足够有用,所以重点来讲;或者说,如果不是二叉树,树的家族也不会如此的德高望重。

在二叉树中,又有一些特殊性质的二叉树,可能没法用树的结构来描述他们之间的关系;比如: 满二叉树一定是完全二叉树;完全二叉树和二叉排序树直接却没有从属关系;完全二叉树和二叉排序树是从不同的维度定义出来的特殊的二叉树。

二叉排序树(也叫二叉查找树)在树的家族中是一颗耀眼的明星,但是在树的章节中没有被介绍,大概因为这是二叉树的实际应用,而和树本身的形态没有直接关系;还有一些特殊的树,如:红黑树、B+、B-树,稍后再研究,有些数据结构的书是没有提及的,大概因为这些东西可以自学,不需要教吧。

树的逻辑结构

1540649c04e19a8e8e40b44f71cef063.png

树的定义

树是n(n>=0)个结点的有限集合。当 n= 0 时,称为空树;任意一颗非空树满足一下两个条件:

有且只有一个特定的称为根的结点

当 n > 1 时,除根结点之外的其余结点被分成m(m>0)个互不相交的有限集合T1, T2, …, Tm,其中每个集合又是一棵树,并称为这个根结点的子树

树的基本术语

结点的度,树的度

叶子结点,分支结点

孩子结点,双亲结点,兄弟结点

路径、路径长度

祖先、子孙

结点的层数、树的深度(高度)

层序编号

有序树、无序树

森林

同构

树的表示形式

一般有四种表示形式:

树形图

嵌套图

凹凸表

广义表

树的遍历

前(根)序遍历

后(根)序遍历

层序遍历

注: 这里说的是树,不是二叉树,所以没有中序遍历(如果有的话,三个子树的树根应该放哪里?)

树的存储结构

双亲表示法

思想: 每个结点都记住自己双亲结点的位置(即可保证该树是唯一的)

缺点: 要找到一个结点的所有孩子是比较麻烦的

使用数组存储还是比较方便的

孩子表示法

思想: 每个结点都记住自己孩子的位置(即可保证该树是唯一的)

缺点: 要找到结点的双亲结点比较麻烦

两种形式:

多重链表标识

思想: 父亲那N个绳拉住自己的N个孩子

关于拿几根绳?两种办法:

有几个孩子拿几根绳

需要有一个地方记录自己的绳子数目(就是该结点的度)

孩子最多的父亲拿几根绳子大家就都拿几根绳子

没人的绳子数目是一样的,不需要各自记录

孩子链表

思想:所有节点维护在一个数组中;然后,父亲拿一根绳子牵着老大,然后老大牵着老二;依次类推

孩子双亲表示法

思想:孩子表示法中,添加一个双亲节点的指针

孩子兄弟表示法

思想: 每个节点都左手拉着自己孩子,右手拉着自己的弟弟妹妹

二叉树

概述

二叉树是一种最简单的树结构,其存储结构更具有规范性和确定性,在一系列条件的约束下,使得二叉树具有很多的性质,方便我们研究和使用二叉树。

二叉树的定义

二叉树的5种基本形态

空二叉树

只有一个根结点

根结点只有左子树

根结点只有右子树

根结点既有左子树又有右子树

特殊二叉树

斜树

左斜树

右斜树

满二叉树

完全二叉树

从满二叉树的最后面的结点去掉n (n >= 0)个结点都是完全二叉树

满二叉树是一种特殊的完全二叉树

二叉树的性质

二叉树有5个重要的性质,他们主要讨论了树的深度、结点数等之间的关系

在二叉树的第i层上至多有2i-1个结点 (i >= 1)

深度为k的二叉树至多有2k-1个结点 (k >=1)

对任何一颗二叉树T,如果其叶子结点数为n0,度为2的结点数为n2,则:n0=n2+1

具有n个结点的完全二叉树的深度为log2n+1

如果有一颗有n个节点的完全二叉树的节点按层次序编号,对任一层的节点i(1<=i<=n)有1.如果i=1,则节点是二叉树的根,无双亲,如果i>1,则其双亲节点为[i/2],向下取整

2.如果2i>n那么节点i没有左孩子,否则其左孩子为2i

3.如果2i+1>n那么节点没有右孩子,否则右孩子为2i+1

二叉树的遍历

前序遍历

中序遍历

后序遍历

二叉树的存储

顺序表

思想: 将一棵树通过添加“虚节点”的方式完善成完全二叉树,然后存储

缺点: 空间浪费严重,只适合存储完全二叉树的情况

链式存储

二叉链表

思想: 每个结点包含数据域和左右孩子两个指针域

缺点: 寻找双亲结点不方便

三叉链表

思想: 在二叉链表的基础上添加双亲结点指针域

线索链表

实际问题: select * from tb where id < N limit 2; 在这种情况下,我们不仅要查到id=2的结点,还要找到他附近的一些结点;即: 需要访问二叉树中的结点在某种遍历序列中的前驱和后继;

于是: 在存储结构中应该保存结点在某种遍历序列中前驱和后继的信息。

思想: 根据二叉树的性质可知,二叉树中有n+1个指针域为空,可以想办法利用起来;通过添加标记来区分是孩子指针还是前驱(或后继)指针;注意: 挨着自己的孩子在线索化中未必就挨着自己,但是要找到挨着自己的那个结点并不难,对于中序线索链表,如果自己子树的深度为k,则,找到自己的前驱或后继的时间复杂度为log2k

由于二叉树的遍历次序有三种,因此有三种意义上的前驱和后继,相应的也有三种线索链表:前序线索链表、中序线索链表、后序线索链表。中序线索链表看起来更加直观一些

中序线索链表上求结点前驱

中序线索链表上求结点后继

中序线索链表上遍历

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

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

相关文章

python3解释器执行'abcdd'.endswith('cd')的结果是___python3解释器执行for x

【判断题】RAM通常由地址译码器、存储矩阵和读/写电路三部分组成。【单选题】Until we reduce our dependence on oil, we will be ( ) the ups and downs of the oil markets.【单选题】python3解释器执行 fork,v in{1:a,2:b}:print(k,v)的结果是():【单选题】He argues that …

java script中定义的var变量怎么在body中使用,深入分析JavaScriptvar中的预解析与副作用...

var的副作用隐式全局变量和明确定义的全局变量间有些小的差异&#xff0c;就是通过delete操作符让变量未定义的能力。通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。这表明&#xff0c;在技术上…

螺旋桨设计软件_第四届智能工业软件及设计技术研讨会暨2019天洑软件用户大会成功举办...

第四届智能工业软件及设计技术研讨会暨2019天洑软件用户大会于2019年6月13日-14日在辽宁省大连市召开。天洑软件用户大会至2019年已成功举办了四届&#xff0c;在历届会议中有来自中国、德国、瑞典、捷克、意大利、美国、加拿大、日本等各行业专家学者共同探讨最新的计算机智能…

php 上一条下一条,thinkPhp里添加显示上一条和下一条

newsinfo.php里的代码if($front[id]!null){$id $front[id];echo "上一条:$front[title]";}else{echo "上一条&#xff1a;没有了";}echo " ";if($after[id]!null){echo "下一条:$after[title]";}else{echo "下一条&#xff…

群晖 百度网盘_海康威视联合百度网盘推出NAS私有存储 贡献带宽获积分兑网盘会员...

此前百度网盘因为限速问题遭到不少用户的吐槽&#xff0c;随后百度网盘推出单次付费加速由于价格过高再次被吐槽。网盘类的服务也确实需要大量的硬盘空间和服务器带宽支撑&#xff0c;所以对用户来说最好的办法还是自己搭建网盘。自己搭建的网盘也就是私有云存储&#xff0c;放…

深信服python面试题_(完整版)往年的深信服笔试题(齐全)

•一&#xff0c;六道选择题(可以多选)1char*p"helloworld";p存储在()指向//堆栈charp[]"helloworld";p存储在()指向全局变量//数据段static变量//数据段分别在哪个地方&#xff1f;1数据段2代码段3堆4堆栈(此题可以配合同文件夹下的char.cpp)(二、例子程序…

matlab 特征值不排序,matlap 代码求解释!从这里开始即可%对特征值进行排序并去掉...

%人脸识别代码clear all % //removes all variables from the workspace. This frees up system memory.close all % //Delete specified figureclc% number of images on your training set.%训练集数目M16;%Chosen std and mean.%It can be any number that it is clos…

python有序队列_【Python】:拓展Queue实现有序不重复队列

最近手头有个需求是这样的&#xff0c;定期检查数据库获取失败任务并且进行重启。最早想到的是添加一个生产者&&消费者队列&#xff0c;但是发现很多棘手的问题。1.重启任务是调用的一个shell脚本然后在脚本中又调用python程序&#xff0c;所以任务完成的状态回传略纠结…

matlab ode45求解齿轮动力学,ode45求解多自由度动力学方程实例.doc

ode45求解多自由度动力学方程实例Ode45函数调用形式如下&#xff1a;[T,Y]ode45(odefun,tspan,y0)相关参数介绍如下&#xff1a;参数名称参数说明odefun用于存放待求解的方程的m文件名&#xff0c;方程必须用y’f(t,y)的形式存放tspan指定自变量范围的向量&#xff0c;通常用[t…

onenetsim定位功能吗_微信小程序新增后台定位功能,你会卸载地图APP用微信导航吗...

[PConline]8月8日&#xff0c;根据微信官方发布的消息显示&#xff0c;小程序新增后台定位功能&#xff0c;并对自动化测试功能进行了升级。据介绍&#xff0c;为了满足线路导航、路线记录等服务场景下&#xff0c;小程序需要长时间持续定位来提供服务。当用户主动将小程序设置…

pdo 错误 php,多语句查询中的PHP PDO错误

我在我的一个实时网络应用程序中遇到了这个问题.看来如果你通过PHP PDO向MysqL发出一个多语句查询,并且第一个语句是一个insert语句,而第二个语句是一个update语句,那么PDO :: nextRowset()函数不会返回正确的数字结果集(请注意,自PHP 5.3起,PDO应该支持每个MySQL查询的多个语句…

hbuid 集成svn_HBuilder如何配置SVN的步骤详解

前言本文主要给大家介绍了关于HBuilder如何配置SVN的相关内容&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说&#xff0c;来一起看看详细的介绍吧。注意&#xff1a;大家都配置前最好先备份好之前的文件资料很早之前就想在编辑器上配置SVN&#xff0c;但找了很多…

MATLAB静力学分析,锻造操作机静力学的Matlab仿真分析

由第3章中该新型锻造操作机的位置反解中的构件的位置以及角度的关系式&#xff0c;均为已知量。施加外力为Ftx50N,Fty300N和沿“轴方向的外力矩M 60000 N.mm。给定初始量范围&#xff0c;通过Matlab软件仿真&#xff0c;可以得到各个液压缸的驱动力的变化曲线。该新型锻造操作机…

babylonjs 设置面板位置_一篇关于开关面板的详细集合,值得收藏转发

对于大部分人来说&#xff0c;开关的布局&#xff0c;开关的种类都会是一脸懵。所以大家在装修的过程中就会迷茫&#xff0c;今天给大家分享一篇集合&#xff0c;相信通过这篇文章&#xff0c;问题会有所缓解~一&#xff0c;开关插座的分类1.电源开关分类&#xff1a;一位单控/…

php递归实现1 10阶乘,用递归实现1到100的和,1到10的阶乘

递归:方法定义中调用方法本身的现象注意实现:1.递归一定要有出口&#xff0c;否则就是死递归 StackOverflowError2.递归的次数不能过多&#xff0c;否则也会出现死递归特殊事项&#xff1a;构造方法不可以递归定义举例&#xff1a;从前有座山&#xff0c;山上有座庙&#xff0c…

xxljob 配置文件_最详细的xxl-job java配置方式spring-boot

转自&#xff1a;https://blog.csdn.net/weixin_44055234/article/details/106565516————XXL-JOB*是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。且支持线…

php怎么排除空的数组,【技术产品】php如何去除空数组

【摘要】对于初入门的php学习者肯定会有很多问题&#xff0c;今天考比过小编为大家整理了关于【技术产品】php如何去除空数组的信息&#xff0c;希望可以帮助到大家。下面就让我们一起来看下【技术产品】php如何去除空数组的具体内容吧&#xff01;php如何去除空数组在php中可以…

ecs 云服务器 管理控制台_【弹性计算】教您快速学会云服务器ECS 创建命令!

云助手命令可以在ECS实例中快速完成运行自动化运维脚本、轮询进程、重置用户密码、安装或者卸载软件、更新应用以及安装补丁等一些日常任务。命令类型可以是Windows PowerShell脚本、Bat批处理命令和Linux Shell脚本&#xff0c;命令中支持自定义参数&#xff0c;方便设置变量值…

vue.js能美化界面吗_vue将单页面改造成多页面应用的方法

问题描述&#xff1a; 手头有一个项目是使用 vue-cli 搭建的单页面应用。项目分为了管理平台和用户查看页面&#xff0c;用户查看页面是很简单的页面&#xff0c;但是在加载过程中&#xff0c;却加载了整个应用的打包代码&#xff0c;量重且影响了响应和体验。我想要的效果是&a…

exoplayer 纯java,Exoplayer不播放任何视频

让Exoplayer工作有问题 . 我设法从网址加载视频 . 但它只播放音频 . 所以我做错了什么 .BandwidthMeter bandwidthMeter new DefaultBandwidthMeter();TrackSelection.Factory videoTrackSelectionFactory new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);TrackSel…