c++树(一)定义,遍历

目录

树的定义

树的基本术语

树的初始起点:我们定义为根

树的层次:

树的定义:

树的性质

性质1:

性质2:

树形结构存储的两种思路

树的遍历模板

树上信息统计方式1-自顶向下统计

树上信息统计方式2-自底向上统计

子树的概念:

总结:​编辑


树的定义

树(Tree)是n(n≥0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:①有且仅有一个特定的称为根(Root)的结点;②当n>1时,其余结点可分为m(m>0)个互不相交的有限集T 1 {T}{1}T 1 ​ 、T 2 {T}{2}T 2 ​ 、... 、T m {T}_{m}T m ​ ,其中每一个集合本身又是一棵树,并且称为根的子树(Sub Tree)。

树的基本术语

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

树的初始起点:我们定义为根

递归树中,都只能从父节点走到子节点。

我们只需要记录每个父节点有哪些子节点,那么就可以遍历整个递归树。

树的层次:

节点高度:指从这个节点到叶子节点的距离(一共经历了几个节点)

节点深度:指从当前节点到根节点的距离(一共经历了几个节点)

树的高度:指所有节点高度的最大值

树的深度:指所有节点深度的最大值

节点的层:从根节点开始,假设根节点为第1层,根节点的子节点为第2层,依此类推

树的定义:

有n(n>=0)个节点,且任意两个点有且仅有一条路径连通的图形。若n=0,此时为空树。

树的性质

性质1:

n个节点,保证任意两点有且仅有一条路径,树中有且仅有n-1条边。

证明:除第一个节点外,连接一个其他节点,至少增加一条边,所以n个点至少要用n-1条边才能保证所有节点连通。若此时再增加一条非重边,任意两点间是否还存在一条唯一路径。

性质2:

树的根结点没有前驱(父节点),除根结点外的所有结点有且只有一个前驱。树中所有结点可以有零个或多个后继(子节点)。

证明:同上。

树形结构存储的两种思路

1.用结构体把每个节点的信息进行封装。这样的优点在于节点信息非常独立,但是所占空间稍大。2.用多个数组,分别描述每个节点的对应信息。这种方式的有点在于速度稍快,写起来简单。

树的遍历模板

通常来讲,树的边都是双向的我们在遍历的时候不希望一个点遍历多次。

方法1.用vis数组进行标记。

方法2.dfs中记录由父亲节点(来向),这样可以阻止走回去。

树上信息统计方式1-自顶向下统计

操作方法:在进入dfs之前进行信息统计。

如求链长:树上两个节点必然有且仅有一条路径,我们可以把该路径看成一条链。路径上的边权和为两点的链长。

树上信息统计方式2-自底向上统计

操作方法:在dfs回溯之时进行信息统计。

如求树的节点个数:当前树上共有多少个节点。

子树的概念:

抹除当前根节点以及所有与根节点的连边后,产生的树都是当前根节点的子树。

如当前根节点1的子树有,以2、3、4为根的子树。

总结:

相关推荐
饮啦冰美式44 分钟前
PPO近端策略优化算法
人工智能·深度学习·算法
void_sk1 小时前
C/C++复习--C语言中的函数详细
c语言·c++·算法
西京刀客1 小时前
Go多服务项目结构优化:为何每个服务单独设置internal目录?
开发语言·后端·golang
吃货界的硬件攻城狮1 小时前
【STM32 学习笔记】I2C通信协议
笔记·stm32·单片机·学习
晨曦学习日记1 小时前
C++学习笔记
c++·笔记·学习
Humbunklung1 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)
笔记·python·学习·pyqt
每次的天空1 小时前
Android Handler 机制面试总结
java·开发语言·jvm
evolution_language1 小时前
LintCode第485题-生成给定大小的数组,第220题-冰雹猜想,第235题-分解质因数
数据结构·算法·新手必刷编程50题
举一个梨子zz1 小时前
Java—— 集合 List
java·开发语言·数据结构·intellij-idea
passionSnail1 小时前
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-贪吃蛇的百变玩法:从命令行到AI对战
开发语言·matlab·游戏程序