数据结构:树的概念和结构

文章目录

  • 1. 树的概念
  • 2. 树的结构
  • 3. 树的相关概念
  • 4. 树的表示
    • 孩子表示法
    • 双亲表示法
    • 孩子兄弟表示法
  • 5. 树在实际中的应用

1. 树的概念

在这里插入图片描述

树是一种非线性的数据结构,它是由 n (n >= 0)个有限结点组成一个具有层次关系的.

把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.

2. 树的结构

  • 有一个特殊的结点,称为根节点,根节点没有前驱节点.
  • 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1,T2,…Tm,其中每一个集合本身又是一棵树,并且称为根的子树
  • 树是递归定义的.

注意:树形结构中,子树之间不能有交集,否则就不是树形结构,是图结构了.


下面就是一个平平无奇的树
在这里插入图片描述

子树 T1 和子树 T2 是根节点 A 的子树,同时 D,G,H,J 组成的树也是以 B 为根节点的子树,所以说树是递归定义的.
在这里插入图片描述


对于树的定义还需要强调两点:

  • n > 0 时根节点是唯一的,不可能存在多个根节点
  • m > 0 时,子树的个数没有限制,但是它们一定是不相交的.

3. 树的相关概念

在这里插入图片描述

结点的度:一个结点含有子树的个数称为该结点的度; 如上图,A的为 2 ,D的为 3
叶结点或终端结点:度为 0 的结点称为叶结点; 如上图, G, H, I, J, F为叶节点
非终端结点或分支结点:度不为 0 的结点; 如上图, A, B, C, D, E为分支结点
双亲结点或父节点:若一个结点含有子节点,则这个结点称为其子节点的父节点; 如上图,A 为 B 的父节点
孩子结点或子节点:一个结点含有的子树的根节点称为该结点的子节点; 如上图,E 是 C 的孩子结点
兄弟结点:具有相同父节点的结点互称为兄弟结点;如上图,G, H, I互称为兄弟结点
树的度:一棵树中,最大的结点的度称为树的度如上图,树的度为 3
结点的层次:从根开始定义起, 根为第1层,根的子节点为第2层,以此类推
树的高度或深度:树中结点的最大层次如上图,该树的高度为4
堂兄弟结点:双亲在同一层的结点互为堂兄弟如上图, I, J互为堂兄弟结点
结点的祖先:从根到该结点所经分支上的所有节点如上图,A 是所有结点的祖先
子孙:以某结点为根的子树中任一节点都称为该节点的子孙如上图:所有结点都是 A 的子孙
森林:由 m (m > 0) 棵互不相交的树的集合称为森林

4. 树的表示

以前学单链表的时候就有一个指针,双链表有两个指针,但是树有几个指针就不确定了,因为树没有规定每个结点有多少孩子.
有三种方式来表示

孩子表示法

说明了树的度为N,使用顺序表表示

每个结点有多个指针域,其中每个指针指向一棵子树的根节点

#define N 3     //假设树的度为Nstruct TreeNode
{int val;struct TreeNode* child[N];  //指针数组
};  

但是这样的表示也有缺陷,就是需要知道树的度,而且很有可能造成空间的浪费

双亲表示法

每个结点中,附设一个指示器指示其双亲结点在数组中的位置

struct TreeNode
{int val;int parent;
}

在这里插入图片描述

在这里插入图片描述

虽然找到该结点的双亲结点时间复杂度为 O ( 1 ) O(1) O(1), 但是要找到该结点的子节点却仍然需要遍历整个树才可以找到,显然这个结构也有缺陷

孩子兄弟表示法

任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的.因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟.

struct TreeNode
{int val;struct TreeNode* firstchild;struct TreeNode* nextbrother;
}

在这里插入图片描述

这样可以说是最优的表示法了
如果我们想要得到某个结点的所有孩子,下面的代码就可以了.

struct TreeNode* Anode;
struct TreeNode* child = Anode->firstchild;while (child)
{printf("%d ", child->val);child = child->nextbrother;
}

这样确实做到了最大节省空间,同时,这也是一个二叉树,它的逻辑结构适合很多操作,是一个很优秀的逻辑结构.

5. 树在实际中的应用

文件系统的目录树结构、网络拓扑,最短路径问题,搜索引擎、思维导图等
在这里插入图片描述

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

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

相关文章

.360勒索病毒和.halo勒索病毒数据恢复|金蝶、用友、ERP等数据恢复

导言: 随着数字化时代的持续发展,网络安全威胁也变得前所未有地复杂和难以应对。在这个充满挑战的网络环境中,勒索病毒已经成为了一种极为危险和破坏性的威胁。最近引起广泛关注的是.360勒索病毒,一种可怕的恶意软件,…

Python实现自主售卖机

1 问题 在python中我们常常使用到条件判断,if语句时常见的条件判断语句之一。那么如何使用if语句实现根据情况自动选择商品进行售卖呢? 2 方法 根据if语句执行时从上往下执行的特点,使用if语句、dict和list来实现整个流程。 代码清单 1 drink…

mysql 快速上传数据

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的,数据要整理成和表格一致,也就是说每条数据都是完整的一条,而不是一部分。 下面的示例我以***为分割符划分字段,以 \n来分割每条数据。 LO…

python连接mysql数据库的练习

一、导入pandas内置的sqlite3模块,连接的信息:ip地址是本机, 端口号port 是3306, 用户user是root, 密码password是123456, 数据库database是lambda-xiaozhang import pymysql# 打开数据库连接,参数1:主机名或IP;参数…

回顾多线程

1.线程有几种状态 public enum State {//新生NEW,//运行RUNNABLE,//阻塞BLOCKED,//等待WAITING,//超时等待TIMED_WAITING,//终止TERMINATED;} 2.wait和sleep的区别 1.来自不同的类 wait>Object类 sleep > Thread类 2.关于锁的释放 wait 会释放锁, s…

基于 Flink CDC 高效构建入湖通道

本文整理自阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人, Apache Flink PMC Member & Committer 徐榜江(雪尽),在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分: Flink CDC 核心技术解析数…

Databend 开源周报第 110 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 使用 BendSQL 管…

uniapp微信小程序地图实现周边

官方说明:小程序JavascriptSDK使用指南 - 微信小程序解决方案 | 腾讯位置服务https://lbs.qq.com/product/miniapp/jssdk/ 先申请腾讯地图的开发者密钥,申请地址:腾讯位置服务 - 立足生态,连接未来 申请密钥时,需要勾…

USB接口针式打印机

1 针式打印机原理 - 针式打印机16针是纵向排列,每次打印垂直的16bit,然后右移一bit,继续下列打印;字节的MSB表示最上面的点,字节LSB表示最下面的点 - 由于汉字字模的点阵是横向排列的,而提供给打印头的信息…

轻量级的Python IDE —— Thonny

现在的开发工具太多了,而且每个开发工具都致力于做成最好用最智能的工具,所以功能越堆越多,越怼越智能。安装这些开发工具比较烧脑,经常需要经过许多配置步骤。作为一个 Python 开发者来说,好多人光是这些配置都要弄半…

Linux系统——远程连接Linux系统(图形化、命令行、使用命令行学习Linux系统、FinalShell)

目录 图形化、命令行 使用命令行学习Linux系统 FinalShell 安装 连接 图形化、命令行 对于操作系统的使用,有2种使用形式: 图形化页面使用操作系统以命令的形式使用操作系统 不论是Windows还是Linux亦或是MacOS系统,都是支持这两种使…

如何让两台手机相互远程控制?

你的两台手机是什么系统的?如果你的两台手机都是安卓系统,而且都是安卓7.0及以上版本的系统,那么恭喜你,这两台手机可以相互远程控制! 你可以利用两个软件实现将两台手机相互远程控制的想法。为了避免混淆&#xff0c…

android 圆形进度条 横向进度条 不确定转圈进度条

1 横向进度条 <ProgressBarstyle"android:style/Widget.ProgressBar.Horizontal"android:layout_width"match_parent"android:layout_height"wrap_content"android:layout_gravity"center"android:max"100"android:secon…

14. 线性代数 - 线性方程组

文章目录 线性方程组矩阵行列式全排列和逆序数N阶行列式(非)齐次线性方程Hi,大家好。我是茶桁。 结束了「微积分」部分的学习之后我们稍作休整,今天正式开始另外一部分:「线性代数」的学习。小伙伴们放松完回来要开始紧张起来了。 我们之前说过,不管是哪一个工程学科,根…

基于JAVA+SSM+微信小程序+MySql的图书捐赠管理系统设计与实现

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当今社会&#xff0…

手机+卫星的科技狂想

最近硬件圈最火热的话题之一&#xff0c;应该就是突然上线、遥遥领先的华为Mate 60 Pro了。 其中&#xff0c;CPU和类5G网速是怎么实现的&#xff0c;是大家特别关注的问题。相比之下&#xff0c;卫星通话这个功能&#xff0c;讨论度就略低一些&#xff08;没有说不火的意思&am…

解决npm install遇到的问题:Error while executing:

目录 一、遇到问题 二、解决办法 三、备用方案 一、遇到问题 npm ERR! Error while executing: npm ERR! D:\IT_base\git\Git\cmd\git.EXE ls-remote -h -t ssh://gitgithub.com/sohee-lee7/Squire.git npm ERR! npm ERR! fatal: unable to access https://github.com/so…

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意&#xff0c;要想成功安装pytorch&#xff0c;python版本也要对应pytorch的相关版本) Anaconda官网最新版本 与自己python版本不否请查找自己版本anaconda版本对应 清华大学镜像下载 2.安装时勾选添加环境变量或者手动添加&am…

rocketmq

&#x1f353;代码仓库 https://gitee.com/xuhx615/rocket-mqdemo.git &#x1f353;基本概念 ⭐生产者(Producer)&#xff1a;消息发布者⭐主题&#xff08;Topic&#xff09;&#xff1a;topic用于标识同一类业务类型的消息⭐消息队列&#xff08;MessageQueue&#xff09…

el-table 列背景色渐变

最初的想法是&#xff0c;给每一行添加背景色&#xff0c;逐行递减透明度&#xff0c;发现结果比较突兀&#xff0c;效果如下&#xff1a; 如果有需要这种样式的&#xff0c;代码如下&#xff1a; <template><div><el-table:data"tableData":heade…