【数据结构】什么是树?

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

📌树的定义

📌树的相关概念

📌线性结构与树结构的对比

📌树的抽象数据类型

📌树的存储结构

🎏双亲表示法

🎏孩子表示法

🎏孩子兄弟表示法

结语


📌树的定义

树(Tree)是n(n≥0)个结点的有限集.n=0时称为空树.

在任意一颗非空树中:

  1. 有且仅有一个特定的称为根(Root)的结点;
  2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T_{1},T_{2},......,T_{m},其中每一个集合本身又是一颗树,并且称为根的子树(SubTree),如下图:

有关树的定义我们还需强调两点:

  1. n>0时根节点是唯一的,不可能存在多个根节点.
  2. m>0时,子树的个数没有限制,但它们一定是互不相交的.下图的两个结构就不符合树的定义,因为它们都有相交的子树:

📌树的相关概念

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

📌线性结构与树结构的对比

线性结构

  • 第一个数据元素:无前驱
  • 最后一个数据元素:无后继
  • 中间元素:一个前驱一个后继

树结构

  • 根节点:无双亲且唯一
  • 叶节点:无孩子,可以存在多个
  • 中间节点:一个双亲多个孩子

📌树的抽象数据类型

这里我们给出了一些树的基本常用操作:

ADT 树(tree)
Data
    树是由一个根结点和若干棵子树构成。树中结点具有相同数据类型及层次关系。
Operation
    InitTree(*T):构造空树T。
    DestroyTree(*T):销毁树T。
    CreateTree(*T,definition):按definition中给出树的定义来构造树。
    ClearTree(*T):若树T存在,则将树T清为空树。
    TreeEmpty(*T):若树T为空树,返回true,否则返回false。
    TreeDepth(*T):返回树T的深度。
    Root(T):返回T的根结点。
    Value(T,cur_e):cur_e是树T中一个结点,返回此结点的值。
    Assign(T,cur_e,value):给树T的结点cur_e赋值为value。
    Parent(T,cur_e):若cur_e是树T中的非根结点,则返回它的双亲,否则返回空。
    LeftChild(T,cur_e):若cur_e是树T的非叶结点,则返回它的最左孩子,否则返回空。
    RightSibling(T,cur_e):若cur_e有右兄弟,则返回它的右兄弟,否则返回空。
    InsertChild(*T,*p,i,c):其中p指向树T的某个结点,i为所指结点p的度加上1,
               非空树c与T不相交,操作结果为插入c为树T中p指结点的第i棵子树。
    DeleteChild(*T,*p,i): 其中p指向树T的某个结点, i为所指结点p的度,操作
                结果为删除T中p所指结点的第i棵子树。
endADT

📌树的存储结构

对于树的存储结构,我们这里介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。

🎏双亲表示法

在链表中,我们设置的结点结构是由一个数据域和一个指针域构成的,如下图:

而到了树结构中,由于树中包含了诸多重要的要素,我们的结点构成就非常的灵活了,以双亲表示法为例,我们在每个结点中,附设一个指示器指示其双亲结点在数组的位置.也就是说,每个节点除了知道自己是谁外,还知道它的双亲在哪里.它的结点结构如下图所示:


🎏孩子表示法

孩子表示法的思路是:

把每个结点放到一个顺序存储结构的数组里,再对每个结点的孩子建立一个单链表体现它们的关系.

具体办法是:

把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空.然后n个头指针又组成一个线性表,采用顺序存储结构,放进一个一维数组中,如下图所示:


🎏孩子兄弟表示法

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

结点示意图:

该方法实现的树如下图所示:


结语

希望这篇树的介绍能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是线性表?

【数据结构】线性表的链式存储结构

【数据结构】什么是栈?

【数据结构】用C语言实现顺序栈(附完整运行代码)

【数据结构】深入浅出理解链表中二级指针的应用

【数据结构】10道经典面试题目带你玩转链表


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

叮咚,微信年度聊天报告(圣诞节版)请查收~丨GitHub star 16.8k+

微信年度聊天报告——圣诞节特别版,快发给心仪的ta吧~ 开源地址 GitHub开源地址:https://github.com/LC044/WeChatMsg 我深信有意义的不是微信,而是隐藏在对话框背后的一个个深刻故事。未来,每个人都能拥有AI的陪伴,…

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

2024年【北京市安全员-B证】考试题库及北京市安全员-B证模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】考试题库及北京市安全员-B证模拟试题,包含北京市安全员-B证考试题库答案和解析及北京市安全员-B证模拟试题练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新大纲…

直接插入排序【从0-1学数据结构】

文章目录 💗 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…

手写线程池

手写线程池 线程池原理 线程池的组成主要分为3个部分,这三部分配合工作就可以得到一个完整的线程池: 任务队列,存储需要处理的任务,由工作的线程来处理这些任务 通过线程池提供的API函数,将一个待处理的任务添加到任…

从归并排序引申到排序链表-图解

从归并排序引申到排序链表 文章目录 从归并排序引申到排序链表归并排序递归版非递归版 排序链表递归版非递归版 归并排序 递归版 //合并排序public static void mergeSort(int[] nums) {mergeSortHelper(0, nums.length, nums); //没有-1}private static void mergeSortHelper…

python 使用 pip 安装第三方库 导入不成功

本文是什么意思呢? 就是你需要使用一些库安装老师或者网上说的 通过pip 安装下载了第三方库,但是使用 import xxx from xxx import xx ,pycharm ide 导入的下面还有红色波浪线,导入不成功。 这是什么原因? 这是pyc…

飞天使-k8s知识点5-kubernetes基础名词扫盲

文章目录 deploymentspodNodeserviceskubectl 实现应用伸缩kubectl 实现滚动更新kubernetes架构 deployments 中文文档 http://docs.kubernetes.org.cn/251.htmldeployment是用来创建和更新应用的,master 会负责将创建好的应用实例调度到集群中的各个节点 应用实例…

Qt 开源项目

Qt 开源项目 Omniverse View链接技术介绍 QuickQanava链接技术介绍QField链接技术介绍 AtomicDEX链接技术介绍 Status-desktop链接技术介绍 Librum链接技术介绍 A Simple Cross-Platform ReaderQPrompt链接技术介绍 GCompris链接技术介绍 Scrite链接技术介绍 QSkinny链接技术介…

力扣思维题——寻找重复数

题目链接:https://leetcode.cn/problems/find-the-duplicate-number/description/?envTypestudy-plan-v2&envIdtop-100-liked 这题的思维难度较大。一种是利用双指针法进行计算环的起点,这种方法在面试里很难说清楚,也很难想到。大致做…

银河麒麟v10 二进制安装包 安装mysql 8.35

银河麒麟v10 二进制安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装依赖包3.2、安装Mysql3.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知,接口ISchedulerListener,如作业的添加、删除、停止、挂起等事件通知,调度器的启动、关闭、出错等事件通知,触发器的暂停、挂起等事件通知,接口部分定义如下&#xff1a…

面试题:JVM 对锁都进行了哪些优化?

文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析,编译器对代码的优化 锁优化 jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…

C++入门-【13-C++ 多维数组】

C 多维数组 C 支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4]; 二维数组 多维数组最简单的形式是二维数组。一个二维数组&am…

超维空间S2无人机使用说明书——32、使用yolov7进行目标识别

引言:为了提高yolo识别的质量,提高了yolo的版本,改用yolov7进行物体识别,同时系统兼容了低版本的yolo,包括基于C的yolov3和yolov4,也有更高版本的yolov8。 简介,为了提高识别速度,系…

Android Studio各种Gradle常见报错问题及解决方案

大家好,我是咕噜铁蛋!在开发Android应用程序时,我们可能会遇到各种Gradle错误。这些错误可能来自不同的原因,例如依赖项问题、配置错误、版本冲突等。今天我通过搜索整理了一下,在这篇文章中,我将分享一些常…

AI 绘画StableDiffusionWebui图生图

介绍 stable-diffusion-webui AI绘画工具,本文介绍图生图,以一张图片做底图优化生成。 例如:上传一张真人照片,让AI把他改绘成动漫人物;上传画作线稿,让AI自动上色;上传一张黑白照&#xff0c…

001 图书增删改查 SSM MySQL

技术框架:Spring SpringMVC Mybatis JSP MySQL 001 图书增删改查 SSM MySQL package com.demo.controller;import com.demo.pojo.Book; import com.demo.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.spri…

Uniapp + Vue3 + Pinia + Vant3 框架搭建

现在越来越多项目都偏向于Vue3开发&#xff0c;想着uniapp搭配Vue3试试效果怎么样&#xff0c;接下来就是详细操作步骤。 初始化Uniapp Vue3项目 App.vue setup语法 <script setup>import {onLaunch,onShow,onHide} from dcloudio/uni-apponLaunch(() > {console.l…

人工智能_机器学习072_SVM支持向量机_人脸识别模型训练_训练时间过长解决办法_数据降维_LFW人脸数据建模与C参数选择---人工智能工作笔记0112

我们先来看一下之前的代码: import numpy as np 导入数学计算库 from sklearn. svm import SVC 导入支持向量机 线性分类器 import matplotlib.pyplot as plt 加载人脸图片以后,我们用pyplot把人脸图片数据展示一下 from sklearn.model_selection import train_test_split 人脸…