算法与数据结构之有根树的表达

本文介绍了有根树的概念,包括根节点、父子节点、度、深度和高度等概念,并探讨了如何在C++中使用左子右兄弟表示法存储和遍历有根树,以实现O(N)的时间复杂度。此外,提供了样例输入和输出,展示如何求解节点的深度。代码示例展示了C++实现的具体过程。

有根树

有根树,顾名思义,就是有根节点的树结构。

有根树的节点之间存在父子关系,其中,有一个节点,叫做“根节点”。根节点没有父节点。

如图所示,1号节点就是根节点,它是唯一一个没有父节点的节点。

以节点5为例,它的兄弟节点分别是2、11,父节点为1,子节点分别为6、7、8.

我们把没有子节点的节点成为叶节点。

有根树中,节点x的子节点数被称为x的度,比如,节点5的度为3.

从根节点到节点x的路径长度称为x的深度,另外,节点x到叶节点的最大路径长度为节点x的高。一棵树中,根节点的高度最大,所以我们把根节点的高称为树的高。

那我们怎么存储这样一个数据结构呢?

自然而然地,我们会想到,把每个节点的父节点、各个子节点的信息都给保存下来,那不就可以把整个有根树保存下来了吗?

可是,这样就存在问题了。每个节点的子节点的数目不一定,那么我们在c++中定义数据结构的时候,就不是很方便。(当然,不得不吐槽的就是,cpp的代码又长又臭。如果是在python里面的话,用上面这种思路定义有根树是很方便的。)但是,如果想实现复杂度为O(N)的遍历,用上面的定义方式就不是很方便了。

那怎么办呢?

我们冷静分析一波:

 

在上面这棵树里,如果我们想要知道每一个节点的确切位置,我们只需要存储当前节点的最左侧子节点和紧邻的右兄弟节点即可确定当前节点在整个树中的位置。

这就是“左子右兄弟表示法”,根据这个方法,我们能通过遍历得到每一个节点的位置信息。

题目

题目位于

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_7_A

因为题目太长然后机器翻译太不准,就不人工翻译写到这了,我就直接把英文原题贴上来吧。

Your task is to write a program which reports the following information

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值