题目描述 给你一个二叉树,请你求出该二叉树的叶子结点数量。二叉树的输入形式见下面的提示。 输入 第一行为n,表示二叉树的数组长度1≤n≤100;第二行为树的数组形式,当tree[i] = 0时,表示为空结点。 输出 二叉树的叶子结点数量。 样例输入 Copy 7 3 9 20 0 0 15 7 样例输出 Copy 3 提示 本题给出的是二叉树的数组形式。数组形式的特点:如果当前节点在数组中的下标为root,那么它的左儿子在数组中的下标为root*2,它的右儿子在数组中的下标为root*2+1; 假设给出的二叉树为3 9 20 0 0 15 7(0表示是空结点),并且当前结点root的下标为1,那么它的左儿子的下标为root*2 = 2即tree[2] = 9, 右儿子的下标为root*2+1=3即tree[3] = 20;root的右儿子的左儿子的编号为3 * 2 = 6即tree[6] = 15,右儿子为3 * 2 + 1 = 7即tree[7] = 7;通过这个关系我们就能使用数组建立树的关系了。建树如下所示: 3 / \ 9 20 / \ 15 7怎么用C语言写
时间: 2024-02-25 13:57:40 浏览: 54
根据上面题目描述中的提示,我们可以使用一个数组来存储二叉树的节点,具体实现如下:
```c
#include<stdio.h>
#define MAXN 105
int tree[MAXN]; // 存储二叉树的数组
int n; // 二叉树的长度
// 递归遍历二叉树,统计叶子结点的数量
int count_leaf(int node) {
if(node > n || tree[node] == 0) { // 超出二叉树范围或者是空结点
return 0;
}
if(tree[node * 2] == 0 && tree[node * 2 + 1] == 0) { // 左右子树均为空,说明是叶子结点
return 1;
}
return count_leaf(node * 2) + count_leaf(node * 2 + 1); // 统计左右子树中叶子结点的数量
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &tree[i]);
}
printf("%d\n", count_leaf(1));
return 0;
}
```
需要注意的是,我们使用数组来存储二叉树时,根节点的下标为1,而不是0。因此在判断节点是否越界时,需要判断是否超出了二叉树的范围,即节点下标是否大于二叉树的长度。同时,当我们遍历到一个空结点时,也需要返回0。
阅读全文