设计算法,编写程序,实现以下功能:
由用户输入一棵扩充二叉树的先序遍历序列 (原
二叉树的节点数据均为自然数,扩充二叉树的先
序序列中,-1为扩充节点),先创建该二叉树的
二叉链存储结构,然后依次输出每层的结点个
数。
输入示例:1 2 9 -1 -1 -1 3 4 -1 -1 5 6 -1 -1 -1
输出示例:1 2 3 1 【每个数字后均有空格】
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点结构
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 创建扩充二叉树
struct TreeNode* createTree() {
int data;
scanf("%d", &data);
if (data == -1) {
return NULL; // 扩充节点
}
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
newNode->data = data;
newNode->left = createTree();
newNode->right = createTree();
return newNode;
}
// 计算每层的结点个数
void countNodesPerLevel(struct TreeNode* root, int level, int* count) {
if (root == NULL) {
return;
}
count[level]++; // 增加当前层的结点个数
// 递归遍历左子树和右子树,层级加1
countNodesPerLevel(root->left, level + 1, count);
countNodesPerLevel(root->right, level + 1, count);
}
int main() {
struct TreeNode* root = NULL;
root = createTree();
// 计算每层的结点个数
int* count = (int*)malloc(sizeof(int) * 100); // 假设最多有100层
for (int i = 0; i < 100; i++) {
count[i] = 0; // 初始化每层的结点个数为0
}
countNodesPerLevel(root, 0, count);
for (int i = 0; i < 100; i++) {
if (count[i] > 0) {
printf("%d ", count[i]);
}
}
printf("\n");
free(count); // 释放动态分配的内存
return 0;
}