有根树的表达——树结构的建立

2023-10-31 23:59
文章标签 建立 表达 树结构 根树

本文主要是介绍有根树的表达——树结构的建立,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

树结构是一种数据结构,它由结点,以及连接结点的边构成。

图中的圆圈表示节点,线表示边。若图中有一个名为“根”的特殊节点,那么这颗树可以被可以称为有根树。

树中节点与节点之间具有父子关系,图中由边连接着的两个节点1与节点2中节点1被称作为节点2的父节点,节点2为节点1的子节点,节点1与3,节点1与4同样具有父子关系。图中有一个节点没有父节点该结点被称为根,图中蓝色结点1就为根。同时我们引入左子右兄弟概念,如图结点2,3,4同时与节点1连接 节点2为节点1的左子节点 节点3为节点2的右兄弟节点 节点4为节点3的右兄弟节点 如节点2又连接着节点5,6 那么节点5是节点2的左子节点,节点6是节点5的右兄弟节点。 既然为被称作树结构那么没有子节点的节点被称为叶节点 图中白色节点则为叶节点,黄色节点为中间节点,蓝节点为根节点

图中某个节点具有的子节点数为该节点的度,如图中的节点1的度为3,节点2的度为2.

从根到节点x的路径长度成为x的深度,如图中2,3,4的深度都为2,图中5,6,7,8为2。另外节点x到叶节点的最大路径长度也被成为节点x的高,如图中节点8,10,5,3的高为0,节点6,7的高为1,节点2,4的高为2。

有根树的表达:(此例题来源于会津大学oj题目)

若对一个有根树的要求如下:

输入:第一行输入节点的个数n,接下来的n行按照下述格式输入各节点的信息,每个节点占一行。

id,k,c1,c2,c3....ck;(id为节点的编号,k为度,c1,c2,c3...ck为第一个子节点到第k个子节点的编号)

输出:按照下述格式输出节点的信息。节点信息

按照编号升序排列。

node id:  parent = p, depth = d, type, [c1,c2,c3.....ck]

p代表父节点编号。不存在父节点时输出-1。d表示节点的深度。type表示节点的类型,从root(根),internal node(内部节点),leaf,三个字符串中选择其一。c1,c2...ck是子节点列表。这里我们将给定树视作有序树,按照输入的顺序输出。相邻的信息用逗号和空格隔开。

限制:1 <=n<=100000。

输入示例:

13
0 3 1 4 10
1 2 2 3
2 0
3 0
4 3 5 6 7
5 0
6 0
7 2 8 9
8 0
9 0
10 2 11 12
11 0
12 0

输出示例:

node 0: parent = -1, depth = 0, root, [1, 4, 10]
node 1: parent = 0, depth = 1, internal node, [2, 3]
node 2: parent = 1, depth = 2, leaf, []
node 3: parent = 1, depth = 2, leaf, []
node 4: parent = 0, depth = 1, internal node, [5, 6, 7]
node 5: parent = 4, depth = 2, leaf, []
node 6: parent = 4, depth = 2, leaf, []
node 7: parent = 4, depth = 2, internal node, [8, 9]
node 8: parent = 7, depth = 3, leaf, []
node 9: parent = 7, depth = 3, leaf, []
node 10: parent = 0, depth = 1, internal node, [11, 12]
node 11: parent = 10, depth = 2, leaf, []
node 12: parent = 10, depth = 2, leaf, []

那么该有根树如下图所示

 

 代码如下:

#include<bits/stdc++.h>using namespace std;int dep[100005]={0};struct pp{int p,l,r;
}i[100005];
//采用结构体的方法记录该节点的父节点p,左子节点l,右兄弟r;void findd(int a,int d){dep[a]=d;if(i[a].r!=-1) findd(i[a].r,d);if(i[a].l!=-1) findd(i[a].l,d+1);
}
//用递归的方法记录每个节点的深度void print(int a){cout<<"node "<<a<<": parent = "<<i[a].p<<", depth = "<<dep[a]<<", ";if(i[a].p==-1) cout<<"root, ";else if(i[a].l==-1) cout<<"leaf, ";else cout<<"internal node, ";if(i[a].l!=-1){cout<<'['<<i[a].l;int b=i[i[a].l].r;while(b!=-1){cout<<", "<<b;b=i[b].r;	}cout<<']';}else{cout<<"[]";}cout<<endl;
}int main()
{int n;cin>>n;for(int c=0;c<n;c++) i[c].l=i[c].p=i[c].r=-1;//初始化为-1,便于讨论for(int c=0;c<n;c++){int id,k,j;cin>>id>>k;for(int d=0;d<k;d++){int a;cin>>a;if(d==0) i[id].l=a;//第一个子节点为左子节点else i[j].r=a;//剩下的依次为上一节点的右兄弟节点j=a;i[a].p=id;//所有节点的父节点都是id节点}}int r;for(int c=0;c<n;c++){if(i[c].p==-1) r=c;//若某一结点没有父节点那么该节点一定是根节点}findd(r,0);//从根节点开始利用递归得到每个节点的深度for(int c=0;c<n;c++) print(c);
}

我是笨蛋

这篇关于有根树的表达——树结构的建立的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319017

相关文章

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【内网】ICMP出网ew+pingtunnel组合建立socks5隧道

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 通过环境搭建,满足以下条件: 攻击机模拟公网vps地址,WEB边界服务器(Windows Server 2008)模拟公司对外提供Web服务的机器,该机器可以通内网,同时向公网提供服务。内网同网段存在一台Windows内网服务

【IDEA】建立多个子模块依赖于一个父模块(maven)

第一步,建立父模块(在IDEA中就是工程) 第二步,选中父模块(也就是工程)右键New Module建立子模块 勾选创建模板原型并一般选择 maven-archetype-quickstart,当创建web模块时选择 maven-archetype-webapp 其他子模块都是类似这样创建~ packaging打包类型有: jar,默认类型warejbea

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程

我想观察UE4是怎么编译的,于是查阅官方文档,了解到UE4有一套自己的编译工具:UnrealBuildTool,简称UBT。关于UBT的官方文档参阅:虚幻编译工具。我想尝试自己手动建立一个使用UBT进行编译的空白工程。不过首先,先了解下UBT的编译流程中一些文件所扮演的角色 UBT的编译流程中一些文件所扮演的角色 模块 每个模块都由一个 .build.cs 文件声明,它存储在 Source

AS3中正则表达式中如何表达“或”

var reg:RegExp=/\r|\n|\t/g;                 var msg:String="123\rabc\n\tabc\ta\123";                 msg=msg.replace(reg,"");                 trace(msg);

Linux - Tcp连接建立和释放的三次握手四次挥手

一、TCP报文段首部格式         源端口/目的端口:各占2个字节,分别写入源端口和目的端口,端口是传输层与应用层的服务接口    序号:占4个字节,TCP连接中传送的数据流中每一个字节都有一个序号,序号字段指本报文段所发送的数据的第一个字节的序号    确认号:占4个字节,是期望收到对方下一个报文的第一个数据字节的序号    数据偏移:占4个字节,它指出TCP报文的数据距离TCP

element table 表格 span-method 某一列进行相同合并 支持树结构表格

须知 这是 vue2 版本,不过理论上 vue3 也能参考使用 可以直接打开 codepen 查看代码 效果图 代码 打不开 codepen 或者codepen 失效,查看下面代码参考 <script src="//unpkg.com/vue@2/dist/vue.js"></script><script src="//unpkg.com/element-ui@2.15.14/l

【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码

【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码 1 比赛时间 北京时间:2024年9月5日 18:00-2024年9月8日20:00 2 思路内容 2.1 往届比赛资料 【2022高教社杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(已经更新完毕) 【2022高教社杯数学建模】C题:古代玻璃制品的成分分析与鉴别 赛后总

如何把文件夹里的所有文件每个建立一个文件夹,并且以文件的名字命名

如何把文件夹里的所有文件每个建立一个文件夹,并且以文件的名字命名?TOC 你可以把文件归类,然后同类型的文件放在相应的文件夹内,你一定要这样做,那你就不停的按那个新建文件夹快捷菜单,新建n个文件夹,然后按顺序选择文件按F2再按Ctrl+C然后把该文件拉进新建文件夹1然后选择新建文件夹1按F2再按Ctrl+v,其余以此类推。这样做很繁琐的。 新的方法 新建一个空白的txt文件,输入: @ec