C++数据结构X篇_12_树的基本概念和存储

news2025/1/19 20:38:26

学习二叉树之前先学习树的概念。

文章目录

  • 1. 树的基本概念
    • 1.1 树的定义
    • 1.2 树的特点
    • 1.3 若干术语
  • 2. 树的表示法
    • 2.1 图形表示法
    • 2.2 广义表表示法
  • 3. 树的存储
    • 3.1 双亲表示法:保存父节点关系
    • 3.2 孩子表示法
    • 3.3 左孩子右兄弟表示法

1. 树的基本概念

之前所学均为线性表,线性表具有什么特点呢?
第一个节点只有一个后继结点,没有前驱,最后一个节点,只有一个前驱,没有后继,其他位置的节点都有前驱和后继。
线性表中每个节点之间都是一对一的关系,存储也就相对容易一些。

下图就是一个树的结构,每一个节点是一对多的关系,每一个节点都有一个双亲节点(父节点、爹妈节点),但是有多个后继,这就是树概念
在这里插入图片描述

1.1 树的定义

由一个或多个(n≥0)结点组成的有限集合 T,有且仅有一个结点称为根(root),当n>1时,其余的结点分为m(m≥0)个互不相交的有限集合 T1,T2,…,Tm。每个集合本身又是棵树,被称作这个根的子树。

1.2 树的特点

  • 非线性结构,有一个直接前驱,但可能有多个直接后继(1:n )
  • 树的定义具有递归性,树中还有树。
  • 树可以为空,即节点个数为 0。

1.3 若干术语

  • –>即根结点(没有前驱)
  • 叶子–>即终端结点(没有后继)
  • 森林–>指 m 棵不相交的树的集合(例如删除 A 后的子树个数)
  • 有序数–>结点各子树从左至右有序,不能互换(左为第一)
  • 无序树–>结点各子树可互换位置。
  • 双亲–>即上层的那个结点(直接前驱) parent
  • 孩子–>即下层结点的子树(直接后继) child
  • 兄弟–>同一双亲下的同层结点(孩子之间互称兄弟) sibling
  • 堂兄弟–>即双亲位于同一层的结点(但并非同一双亲)cousin
  • 祖先–>即从根到该结点所经分支的所有结点
  • 子孙–>即该结点下层子树中的任一结点
    在这里插入图片描述
  • 结点–>即树的数据元素
  • 结点的度–>结点挂接的子树数( 有几个直接后继就是几度 )
  • 结点的层次–>从根到该结点的层数( 根结点算第一层 )
  • 终端结点–>即度为 0 的结点,即叶子
  • 分支结点–>除树根以外的结点( 也称为内部结点)
  • 树的度–>所有结点度中的最大值( Max(各结点的度》)
  • 树的深度(或高度)–>所有结点中最大的层数( Max(各结点的层次))
    上图中的结点数= 13,树的度= 3,树的深度= 4

2. 树的表示法

2.1 图形表示法

事物之间的逻辑关系可以通过数的形式很直观的表示出来,如下图:
在这里插入图片描述

2.2 广义表表示法

在这里插入图片描述
用广义表表示法表示上图:
中国( 河北( 保定,石家庄 ),广东( 广州,东莞 ),山东( 青岛,济南 ) )
根作为由子树森林组成的表的名字写在表的左边。

3. 树的存储

前面我们学习了顺序存储链式存储,以下面的树为例,如何进行存储呢?也可以使用顺序存储:A,B,C,D...M,放到数组中,但是你不知道谁是谁儿子和爹吗?
在这里插入图片描述

3.1 双亲表示法:保存父节点关系

了解即可

struct Node {
   int data; //节点值
   int parent; //父节点下标
}

为了找到某一个节点的孩子是谁,需要进行遍历查看父节点信息。
上面的方法是站在爹妈的角度去看的

3.2 孩子表示法

以孩子成长的角度来看就是孩子表示法。以链式去保存,需要保存孩子的信息,但是孩子数量不固定,对于ChildNode*就不知道定义几个指针了,定义的多了就会产生多余指针。

可以通过链表将孩子节点进行保存,这样就可以通过链表将节点进行保存

struct ChildNode {
   int data; //节点值
   ChildNode*
}
childNode D;
D.ChildNode*;

3.3 左孩子右兄弟表示法

不管是什么样的树,都可以转换为二叉树

第一个节点A,左孩子为B,右兄弟没有,B的左孩子E,右兄弟C,E的左孩子K,右兄弟F,K的左孩子没有,右兄弟L,到F,左孩子和右兄弟没有,到C,左孩子G,右兄弟D,D的左孩子H,右兄弟没有,到H,左孩子M,右兄弟I,I的左孩子没有,右兄弟J。

在这里插入图片描述
通过左孩子右兄弟之后就转换为这种树,每个节点有0到2个孩子,这种树称为二叉树。

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

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

相关文章

22 相交链表

相交链表 题解1 快慢双指针改进 (acb bca)题解2 哈希表(偷懒) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意&#xff…

Golang gorm manytomany 多对多 更新、删除、替换

Delete 移除 只删除中间表的数据 删除原有的 var a Article1db.Preload("Tag1s").Take(&a, 1)fmt.Printf("%v", a) {1 k8s [{1 cloud []} {2 linux []}]}mysql> select * from article1; ------------ | id | title | ------------ | 1 | k8s …

导数公式及求导法则

目录 基本初等函数的导数公式 求导法则 有理运算法则 复合函数求导法 隐函数求导法 反函数求导法 参数方程求导法 对数求导法 基本初等函数的导数公式 基本初等函数的导数公式包括: C0(x^n)nx^(n-1)(a^x)a^x*lna(e^x)e^x(loga(x))1/(xlna)(lnx)1/x(sinx)cos…

十大排序算法及Java中的排序算法

文章目录 一、简介二、时间复杂度三、非线性时间比较类排序冒泡排序(Bubble Sort)排序过程代码实现步骤拆解演示复杂度 选择排序(Selection Sort)排序过程代码实现步骤拆解演示复杂度 插入排序(Insertion Sort&#xf…

用冒泡排序完成库函数qsort的作用

Hello,今天分享的是我们用冒泡函数实现qsort,也就是快排,之前我们也讲过库函数qsort的使用方法,今天我们尝试用冒泡函数实现一下,当然我们也见过qsort,后面也会继续完善的。这几天我是破防大学生&#xff0…

使用python制作一个简单的任务管理器

本篇文章教大家 使用 Python 创建一个简单的任务管理器应用程序。这个项目将帮助你练习 Python 编程的许多方面,包括文件操作、用户输入处理和基本的命令行界面设计。在这篇文章中,我将指导你创建一个基本的命令行任务管理器。 目录 任务管理器的用途任务…

NLP机器翻译全景:从基本原理到技术实战全解析

目录 一、机器翻译简介1. 什么是机器翻译 (MT)?2. 源语言和目标语言3. 翻译模型4. 上下文的重要性 二、基于规则的机器翻译 (RBMT)1. 规则的制定2. 词典和词汇选择3. 限制与挑战4. PyTorch实现 三、基于统计的机器翻译 (SMT)1. 数据驱动2. 短语对齐3. 评分和选择4. PyTorch实现…

App Inventor 2 实现Ascii码转换(Ascii编码与解码)

之前有同学问,App Inventor 2 字符及Ascii码如何进行转换,经过调查,其原生的组件和内置块无法完成这个功能,网上也有利用Web客户端组件执行js代码来进行转换,不过逻辑稍复杂效率还不高。这里介绍一个拓展可以非常方便的…

【算法系列 | 8】深入解析查找算法之—二分查找

序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第8讲,讲一…

CrossOver 23 正式发布:可在 Mac 上运行部分 DX12 游戏

CodeWeivers 公司于今年 6 月发布了 CrossOver 23 测试版,重点添加了对 DirectX 12 支持,从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿,表示正式发布 CrossOver 23 稳定版,在诸多新增功能中,最值…

【经典小练习】JavaSE—拷贝文件夹

🎊专栏【Java小练习】 🍔喜欢的诗句:天行健,君子以自强不息。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🎄效果🌺代码🛸讲解&#x…

Java学习之--类和对象

💕粗缯大布裹生涯,腹有诗书气自华💕 作者:Mylvzi 文章主要内容:Java学习之--类和对象 类和对象 类的实例化: 1.什么叫做类的实例化 利用类创建一个具体的对象就叫做类的实例化! 当我们创建了…

预算有限但想改善客户服务?教你几招轻松解决~

这里有一个常见的误解:只有大公司需要客户服务。事实是,无论行业规模大小,出色的客户服务对每个企业都至关重要。事实上,企业规模越小,客户服务就越重要,因为他们无法承受失去客户的后果。 不仅如此&#…

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。 问题 package mainimport ("fmt""reflect""unsafe" )func main() {var s1 []ints2 : make([]int,0)s4 : make([]int,0)fmt.Printf("s1 pointer:%v, s2 p…

【UE虚幻引擎】UE源码版编译、Andorid配置、打包

首先是要下载源码版的UE,我这里下载的是5.2.1 首先要安装Git 在你准备放代码的文件夹下右键点击Git Bash Here 然后可以直接git clone https://github.com/EpicGames/UnrealEngine 不行的话可以直接去官方的Github上下载Zip压缩包后解压 运行里面的Setup.bat&a…

浅谈C++|STL之vector篇

一.vector的基本概念 vector是C标准库中的一种动态数组容器,提供了动态大小的数组功能,能够在运行时根据需要自动扩展和收缩。vector以连续的内存块存储元素,可以快速访问和修改任意位置的元素。 以下是vector的基本概念和特点: 动…

第27章_瑞萨MCU零基础入门系列教程之freeRTOS实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

Anaconda下Jupyter Notebook执行OpenCV中cv2.imshow()报错(错误码为1272)网上解法汇总记录和最终处理方式

零、我设备的相关信息 Python 3.8.8Anaconda3 2021.05查询匹配python3.8.*的OpenCV匹配版本为:4.1.* — 4.2.*,我最后安装4.2.0.32版本如下我记录了 “从发现问题,到不断试错,最后解决问题” 的完整过程,以备自己复盘…

二叉树顺序存储结构

目录 1.二叉树顺序存储结构 2.堆的概念及结构 3.堆的相关接口实现 3.1 堆的插入及向上调整算法 3.1.1 向上调整算法 3.1.2 堆的插入 3.2 堆的删除及向下调整算法 3.2.1 向下调整算法 3.2.2 堆的删除 3.3 其它接口和代码实现 4.建堆或数组调堆的两种方式及复杂度分析…

SpringCloud Eureka搭建会员中心服务提供方-集群

😀前言 本篇博文是关于SpringCloud Eureka搭建会员中心服务提供方-集群,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您…