1-1 统计度为1的结点数
分数 3
作者 黄龙军
单位 绍兴文理学院
要求实现函数,统计并返回二叉树中的度为1的结点数。二叉树采用二叉链表存储,结点结构如下:
struct BiTNode { char data; BiTNode *lchild, *rchild; };
|
函数接口定义:
int CountSingle(BiTNode *T);
|
其中参数 T是指向二叉树根结点的指针。
裁判测试程序样例:
#include<iostream> #include<string> using namespace std;
struct BiTNode { char data; BiTNode *lchild, *rchild; };
int CountSingle(BiTNode *T); BiTNode *CreateBiTree(string &s);
int main() { string s; while(cin>>s) { BiTNode* root=CreateBiTree(s); cout<<CountSingle(root)<<endl; } return 0; }
BiTNode *CreateBiTree(string &s) { if(s[0]=='*') { s=s.substr(1); return NULL; } BiTNode *p=new BiTNode; p->data=s[0]; s=s.substr(1); p->lchild=CreateBiTree(s); p->rchild=CreateBiTree(s); return p; }
|
输入样例:
HDA**C*B**GF*E*** -+a**xb**-c**d**/e**f**
|
输出样例:
解析
int CountSingle(BiTNode* T) { if (T == NULL) { return 0; } int current = 0; bool has_lchild = (T->lchild != NULL); bool has_rchild = (T->rchild != NULL); if (has_lchild != has_rchild) { current++; } return current + CountSingle(T->lchild) + CountSingle(T->rchild); }
|
注意
思路
-
递归遍历二叉树:二叉树的结构具有递归性,因此可以采用递归的方式遍历每个节点。
-
判断节点的度
:对于每个节点,检查其左子节点和右子节点的存在情况:
- 如果左子节点存在而右子节点不存在,或者左子节点不存在而右子节点存在,则该节点的度为 1。
- 否则,该节点的度不为 1(可能为 0 或 2)。
-
累加度为 1 的节点数:对每个节点进行度的判断后,累加当前节点的贡献(1 如果度为 1,否则为 0),再加上其左子树和右子树中度为 1 的节点数,即可得到总的度为 1 的节点数。
解释
- 递归终止条件:当节点为
nullptr(空节点)时,返回 0,因为空节点没有子节点,不贡献度为 1 的节点。
- 节点度的判断:通过检查左子节点(
lchild)和右子节点(rchild)是否存在,若仅有一个存在,则当前节点度为 1,贡献 1;否则贡献 0。
- 递归累加:对当前节点的贡献值加上其左子树和右子树中度为 1 的节点数,得到最终结果。
这种方法利用二叉树的递归特性,遍历每个节点一次,时间复杂度为 O (n),其中 n 为二叉树的节点总数,空间复杂度为 O (h)(h 为二叉树的高度),主要用于递归调用栈的开销。
1-2 二叉树求结点数
分数 3
作者 鲁法明
单位 山东科技大学
编写函数计算二叉树中的节点个数。二叉树采用二叉链表存储结构。
函数接口定义:
int NodeCountOfBiTree ( BiTree T);
|
其中 T是二叉树根节点的地址。
裁判测试程序样例:
#include<stdlib.h> #include<stdio.h> #include<malloc.h>
#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INFEASIBLE -2
typedef int Status;
typedef int TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
Status CreateBiTree(BiTree &T){ TElemType e; scanf("%d",&e); if(e==0)T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); if(!T)exit(OVERFLOW); T->data=e; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; }
int NodeCountOfBiTree ( BiTree T);
int main() { BiTree T; int n; CreateBiTree(T); n= NodeCountOfBiTree(T); printf("%d",n); return 0; }
|
输入样例(注意输入0代表空子树):
输出样例:
解析
int NodeCountOfBiTree(BiTree T) { if (T == NULL) { return 0; } return 1 + NodeCountOfBiTree(T->lchild) + NodeCountOfBiTree(T->rchild); }
|
注意
要确定二叉树中的节点个数,核心是统计所有非空节点的数量(虚节点,如之前例子中的*,不视为有效节点)。
逻辑计算:递归遍历统计
二叉树的节点个数可以通过递归遍历计算,思路是:当前树的节点数 = 1(当前根节点) + 左子树的节点数 + 右子树的节点数
1-3 求二叉树的高度
分数 5
作者 YJ
单位 西南石油大学
输入二叉树的先序序列以创建二叉树,并求出该二叉树的高度。
函数接口定义:
其中 Tree 是用户传入的参数,代表指向二叉树根节点的指针。
裁判测试程序样例:
#include<stdio.h> #include<malloc.h> #define len sizeof(struct BiTNode )
typedef struct BiTNode { char data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree;
void creat(BiTree &Tree) { char ch; scanf("%c",&ch); if(ch=='#') Tree=NULL; else { Tree=(BiTree)malloc(sizeof(BiTNode)); Tree->data=ch; creat(Tree->lchild); creat(Tree->rchild); } } int Depth(BiTree Tree); int main() { BiTree Tree; creat(Tree); printf("%d\n",Depth(Tree)); return 0; }
|
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
解析
int Depth(BiTree Tree) { if (Tree == NULL) { return 0; } int leftDepth = Depth(Tree->lchild); int rightDepth = Depth(Tree->rchild); if (leftDepth > rightDepth) { return 1 + leftDepth; } else { return 1 + rightDepth; } }
|