2022.11.19
任务描述
本关任务:给定一棵二叉树,计算该二叉树的深度、总节点个数和叶子节点个数。
相关知识
为了完成本关任务,你需要掌握:1.二叉树深度概念,2.二叉树节点,3.二叉树叶子节点概念。
二叉树深度概念
二叉树的深度指的是二叉树中最大的结点层数。例如:图1所示的二叉树最大的节点层数为3,所以该二叉树深度为3。
二叉树节点
二叉树的节点包含一个数据元素及两个指向子树的分支,例如:图1所示的二叉树的总节点个数为6。
二叉树叶子节点概念
叶子节点是度为0的节点,二叉树节点的度为子树的个数。例如:图1所示的二叉树叶子节点为C,D和F,个数为3。
编程要求
本关的编程任务是补全右侧代码片段GetTreeDepth、GetNodeNumber和GetLeafNodeNumber中Begin至End中间的代码,具体要求如下:
- 在GetTreeDepth中计算该二叉树的深度,返回深度值。
- 在GetNodeNumber中计算该二叉树的总的节点个数,返回节点个数。
- 在GetLeafNodeNumber中计算该二叉树的叶子节点个数,返回叶子节点个数。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入
:ABC##D##EF###
预期输出
:
3
6
3
测试输入
:ABCD###E#F##G##
预期输出
:
4
7
3
开始你的任务吧,祝你成功!
C/C++代码
//
// binary_tree.cpp
#include "binary_tree.h"
//创建新结点的工具函数
BTNode* getNewNode(char e)
{
BTNode* p = (BTNode*)malloc(sizeof(BTNode));
p->data = e;
p->lchild = p->rchild = NULL;
return p;
}
// 计算该二叉树的深度
// 参数:二叉树根节点root
// 返回:二叉树的深度
int GetTreeDepth(BTNode* root)
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(!root)return 0;
if(!root->lchild && !root->rchild)return 1;
int deep=0;
int deepl = GetTreeDepth(root->lchild);
if(deep<deepl)deep=deepl;
int deepr = GetTreeDepth(root->rchild);
if(deep<deepr)deep=deepr;
return deep+1;
/********** End **********/
}
// 计算该二叉树的总节点个数
// 参数:二叉树根节点root
// 返回:二叉树的总节点个数
int GetNodeNumber(BTNode* root)
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (root == NULL)
return 0;
else
return GetNodeNumber(root->lchild) + GetNodeNumber(root->rchild) +1;
/********** End **********/
}
// 计算该二叉树的叶子节点个数
// 参数:二叉树根节点root
// 返回:二叉树的叶子节点个数
int GetLeafNodeNumber(BTNode* root)
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(!root)return 0;
if(!root->lchild && !root->rchild) return 1;
int leaf = GetLeafNodeNumber(root->lchild);
leaf += GetLeafNodeNumber(root->rchild);
return leaf;
/********** End **********/
}