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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

直流降压的简单方法_量血压的重大误区和简单的降压方法,尽快转告身边人!...

见五蕴皆空&#xff0c;度一切苦厄。舍利子&#xff0c;色不异空&#xff0c;空不异色&#xff0c;色即是空&#xff0c;空即是色&#xff0c;受想行识&#xff0c;亦复如是。舍利子&#xff0c;是诸法空相&#xff0c;不生不灭&#xff0c;不垢不净&#xff0c;不增不减。是故…

php oauth2 和 jwt,jwt-auth: thinkphp 的 jwt (JSON Web Token)身份验证扩展包,支持Swoole...

JWT-AUTHthinkphp的jwt(JSON Web Token)身份验证包。支持Header、Cookie、Param等多种传参方式。包含&#xff1a;验证、验证并且自动刷新等多种中间件。支持Swoole环境要求php > 7.0thinkphp ^5.1.10 || ^6.0.0说明目前支持如下三大类型加密方式&#xff1a;RSA,HASH,DSA。…

qt 将int型数据显示在文本框_Qt编写Online judge爬虫

一、前提刚开始接触C/Qt是需要一个项目练练手&#xff0c;当时听说过OJ并且网络不好&#xff0c;就想着把数据获取下来随时使用。后来代码写多了之后听说Python写爬虫更方便&#xff0c;可惜坑已经跳下去了&#xff0c;就一条路走到黑了。这是我代码之路的第一个完整实现完整功…

vim函数跳转 php,求助!! vim-gvim中如何让其显示函数及其参数!!

求助&#xff01;&#xff01; vim-gvim中如何让其显示函数及其参数&#xff01;&#xff01;(2012-06-05 02:25:34)标签&#xff1a;如何杂谈求助&#xff01;&#xff01;vim/gvim中如何让其显示函数及其参数&#xff01;&#xff01;用了一段时间的vim,发现在自动补全中发现…

php添加填空,PHP之preg_replace_callback(),将填空题的[[]]替换成______

preg_replace_callback 函数执行一个正则表达式搜索并且使用一个回调进行替换。语法图1这个函数的行为除了可以指定一个 callback 替代 replacement 进行替换字符串的计算&#xff0c;其他方面等同于 preg_replace()。参数说明&#xff1a;$pattern: 要搜索的模式&#xff0c;可…

怎么用php写软件老吴p,11.32 php扩展模块装安

php动态扩展模块添加因为业务需要或者编译php的时候少安装了一个模块&#xff0c;我们现在需要新添加一个模块&#xff0c;那怎么做呢&#xff1f;查看模块/usr/local/php/bin/php -m第一步&#xff1a;去php的安装目录中/ext/目录下查看有没有 你需要安装的扩展模块的包比如&a…

linux用户没有创建文件的权限设置密码,Linux学习第五章用户身份与文件权限

一、用户身份与能力Linux系统中一共有三种用户第一种&#xff1a;管理员 root UID 0第二种&#xff1a;系统用户 不需要登录系统 负责单一服务的运行 UID 0-1000第三种&#xff1a;普通用户 日常登录系统操作的用户 UID 1000--uid1000(zhang) gid1000(zhang) groups…

是vans_Vans 的旧海报上原来有这么多学问…

事情是这样的&#xff0c;某天&#xff0c;当我们编辑部翻开一张 Vans 70 年代的海报&#xff0c;发现开头上面写着&#xff1a;GO “JAMIN” IN VANS。这段话引起了在场的所有人的好奇。(图片来源&#xff1a;Vans)到底什么是 “JAMIN” 呢&#xff1f; 在我们刨根究底的搜寻下…

云科技网络验证源码_面向虚拟化架构和容器云的开源安全工具

随着云和虚拟技术发展&#xff0c;docker容器的使用越来越流行和方便。有很多企业已经把基础架构由传统实体机转移到了虚拟机化架构&#xff0c;基于公有云、私有云以及容器云构建在线服务。与容器相关的安全性对变得越来越重要。与传统的安全性方法相比&#xff0c;虚拟化架构…

linux ubuntu 安装yum,ubuntu使用yum安装软件问题

其实ubuntu是不应该用yum来管理软件安装的&#xff0c;只是后来才发现的&#xff0c;这里记录一下尝试的过程。一开始是想把windows桌面上的文件拖到xshell登录的ubuntu的目录中&#xff0c;但是没成功&#xff0c;参考https://blog.csdn.net/liuao107329/article/details/4999…

linux异步实现原理,Android异步处理四:AsyncTask的实现原理

分析&#xff1a;在分析实现流程之前&#xff0c;我们先了解一下AsyncTask有哪些成员变量。privatestaticfinalintCORE_POOL_SIZE 5;//5个核心工作线程privatestaticfinalintMAXIMUM_POOL_SIZE 128;//最多128个工作线程privatestaticfinalintKEEP_ALIVE 1;//空闲线程的超时时间…

mysql5.7 for linux7,大道浮屠诀---mysql5.7.28 for linux安装

环境&#xff1a;redhat6.5安装RMP包的具体操作如下&#xff1a;1、如有mariadb,先卸载rpm -qa |grep mariadbrpm -qa |grep mysql*rpm -e --nodeps xxxxxx (卸载查询到的rpm包)2、安装新的mysql5.7.28&#xff0c;解压安装包tar -xvf mysql-5.7.28-1.el6.x86_64.rpm-bundle.t…

一维数组kmeans聚类c语言,一维数组的 K-Means 聚类算法理解

刚看了这个算法&#xff0c;理解如下&#xff0c;放在这里&#xff0c;备忘&#xff0c;如有错误的地方&#xff0c;请指出&#xff0c;谢谢需要做聚类的数组我们称之为【源数组】需要一个分组个数K变量来标记需要分多少个组&#xff0c;这个数组我们称之为【聚类中心数组】及一…

c语言根据图片轮廓图,c语言通过opencv实现轮廓处理与切割

c语言通过opencv实现轮廓处理与切割发布时间&#xff1a;2020-10-14 11:00:33来源&#xff1a;脚本之家阅读&#xff1a;89作者&#xff1a;Farmwang注意在寻找轮廓时要选择中寻找外层轮廓RETR_EXTERNAL#include "opencv/cv.h"#include "opencv/highgui.h"…