【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
目录😋
计算二叉树的结点个数、叶子结点个数、某结点的层次和二叉树的宽度
本关任务
编写一个程序验证二叉树的性质。
相关知识
为了完成本关任务,你需要掌握:
- 根据二叉树的括号表示串,创建二叉树b。
- 计算二叉树的结点个数、叶子结点个数、某结点的层次和二叉树的宽度。
根据二叉树的括号表示串,创建二叉树
1. 定义二叉树节点结构体
首先,需要定义二叉树节点的结构体,它包含节点的值、左子节点指针和右子节点指针:
2. 实现构建二叉树的函数
下面的函数
buildTree
用于根据给定的括号表示串来构建二叉树,思路是通过解析字符串,递归地构建各个节点及其子树上述代码中:
- 首先判断输入的字符串是否为空,如果为空则直接返回
nullptr
,表示构建空二叉树。- 接着解析出根节点的值:跳过最外层括号后,处理可能存在的负号,然后按顺序读取数字字符并转换为对应的整数值,创建根节点对象。
- 之后通过遍历字符串来确定左子树对应的括号表示部分:使用一个计数器
count
来跟踪括号的匹配情况(遇到(
就加 1,遇到)
就减 1),当count
再次变为 0 时,表示找到了左子树对应的完整括号表示,然后递归调用buildTree
函数来构建左子树,并将其赋值给根节点的左子节点指针。- 最后,类似地提取右子树对应的括号表示部分,并递归构建右子树,将其赋值给根节点的右子节点指针,最终返回构建好的二叉树的根节点。
3. 使用示例
以下是一个简单的使用示例,展示如何调用
buildTree
函数来构建二叉树并进行简单验证在实际应用中,你可以根据具体需求进一步扩展功能,比如添加更多的错误处理逻辑,在构建过程中如果输入字符串不符合二叉树括号表示规范(如括号不匹配、节点值格式错误等)进行相应的报错提示;或者实现二叉树的遍历函数(如前序遍历、中序遍历、后序遍历等)来更全面地查看构建好的二叉树的结构情况等。
计算二叉树的结点个数、叶子结点个数、某结点的层次和二叉树的宽度
以下是使用 C++ 语言实现计算二叉树的节点个数、叶子节点个数、某节点的层次以及二叉
树的宽度的代码示例及详细解释。这里假设已经定义好了二叉树的节点结构体,如下所示:
1. 计算二叉树节点个数
可以通过递归的方式来计算二叉树的节点个数,思路是节点个数等于 1(根节点)加上左子树节点个数加上右子树节点个数。
在上述函数中:
- 首先判断根节点是否为空,如果为空,说明二叉树为空树,节点个数为 0,直接返回 0。
- 否则,递归地计算左子树和右子树的节点个数,并加上 1(代表根节点)后返回,以此来得到整棵二叉树的节点个数。
2. 计算二叉树叶子节点个数
叶子节点是指没有子节点(左子节点和右子节点都为
NULL
)的节点,同样可以使用递归方式来统计。在这个函数里:
- 先判断根节点是否为空,为空则返回 0,因为空树没有叶子节点。
- 接着判断根节点是否为叶子节点(即左、右子节点都为空),若是则返回 1。
- 如果根节点不是叶子节点,就递归地分别统计左子树和右子树中的叶子节点个数,然后相加返回,得到整棵树的叶子节点个数。
3. 计算某节点的层次
可以通过从根节点开始进行层次遍历(例如使用队列来辅助实现广度优先搜索)来确定某节点所在的层次,根节点层次为 1,每向下一层层次数加 1。
在上述函数中:
- 首先判断根节点是否为空,如果为空则直接返回 0,因为不存在层次一说。
- 然后创建一个队列用于层次遍历,将根节点入队,并初始化层次数为 1。
- 在循环中,每次取出队列中当前层的所有节点(通过
size
控制循环次数),检查是否为目标节点,如果是则返回当前层次数。对于当前层的每个节点,将其左、右子节点(如果存在)入队,以便后续遍历下一层,每处理完一层层次数加 1。- 如果遍历完整个树都没找到目标节点,则返回 0。
4. 计算二叉树的宽度
二叉树的宽度可以理解为各层节点数最多的那一层的节点个数,通过层次遍历并记录每层的节点个数来找到最大宽度。
在这个函数中:
- 同样先判断根节点是否为空,为空则返回 0,因为空树宽度为 0。
- 接着使用队列进行层次遍历,每次循环开始时记录当前层的节点个数
size
,并更新最大宽度maxWidth
(取当前最大宽度和当前层节点个数中的较大值)。- 然后将当前层的每个节点的左、右子节点(如果存在)入队,以便遍历下一层。
- 遍历完整个二叉树后,返回最大宽度值,即二叉树各层中节点数最多的那一层的节点个数。
以下是一个简单的使用示例,展示如何调用这些函数:
测试说明
平台会对你编写的代码进行测试:
测试输入:
A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
K
预期输出:
输出二叉树b:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
二叉树b的结点个数:14
二叉树b的叶子结点个数:6
二叉树b中值为K结点的层次:5
二叉树b的宽度:4
开始你的任务吧,祝你成功!
通关代码
测试结果
- 点赞
- 收藏
- 关注作者
评论(0)