通过键盘输入的扩充二叉树的层次遍历序列, 建立二叉树(如:序列:2,5,6,0,0,10,11,0,0,0,0 )。(设二叉树结点的数据为int型,其中扩充结点用'0'号表示)。然后按中序和后序输出此二叉树,求该树的叶结点个数和度数为2的结点个数)
时间: 2025-01-05 09:38:58 浏览: 21
好的,我可以为您编写一个C语言程序来完成这个任务。以下是完整的代码,我会逐步解释每个部分的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// 通过层次遍历序列创建二叉树
TreeNode* createTree() {
int data;
scanf("%d", &data);
if (data == 0) return NULL;
TreeNode* root = createNode(data);
TreeNode* queue[100];
int front = 0, rear = 0;
queue[rear++] = root;
while (front < rear) {
TreeNode* current = queue[front++];
scanf("%d", &data);
if (data != 0) {
current->left = createNode(data);
queue[rear++] = current->left;
}
scanf("%d", &data);
if (data != 0) {
current->right = createNode(data);
queue[rear++] = current->right;
}
}
return root;
}
// 中序遍历
void inorder(TreeNode* root) {
if (root == NULL) return;
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
// 后序遍历
void postorder(TreeNode* root) {
if (root == NULL) return;
postorder(root->left);
postorder(root->right);
printf("%d ", root->data);
}
// 计算叶节点数量
int countLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1;
return countLeaves(root->left) + countLeaves(root->right);
}
// 计算度数为2的节点数量
int countDegreeTwo(TreeNode* root) {
if (root == NULL) return 0;
if (root->left != NULL && root->right != NULL) {
return 1 + countDegreeTwo(root->left) + countDegreeTwo(root->right);
}
return countDegreeTwo(root->left) + countDegreeTwo(root->right);
}
int main() {
printf("请输入二叉树的层次遍历序列(用0表示空节点):\n");
TreeNode* root = createTree();
printf("中序遍历结果:\n");
inorder(root);
printf("\n");
printf("后序遍历结果:\n");
postorder(root);
printf("\n");
printf("叶节点数量: %d\n", countLeaves(root));
printf("度数为2的节点数量: %d\n", countDegreeTwo(root));
return 0;
}
```
现在让我解释一下这个程序的主要部分:
1. 我们定义了一个TreeNode结构来表示二叉树的节点。
2. createNode函数用于创建新节点。
3. createTree函数通过层次遍历序列创建二叉树。它使用一个队列来跟踪节点,以便正确地建立左右子节点。
4. inorder和postorder函数分别执行中序和后序遍历。
5. countLeaves和countDegreeTwo函数计算叶节点和度数为2的节点数量。
6. 在main函数中,我们首先调用createTree来创建树,然后执行中序和后序遍历,最后计算并输出叶节点和度数为2的节点数量。
这个程序可以处理任意大小的二叉树,只要输入的序列正确且不超过队列大小限制。
阅读全文