C语言编程:【问题描述】 (1)根据先序扩展序列构建二叉树 (2)求二叉树结点数 (3)求二叉树叶子结点数 (4)求二叉树高度 【输入形式】 字符串(根据先序扩展序列构建二叉树,空结点以“#”填充) 【输出形式】 二叉树结点数 二叉树叶子结点数 二叉树高度
时间: 2024-01-23 19:11:47 浏览: 76
好的,我会尽力回答你的问题。这是一个关于二叉树的问题,需要根据先序扩展序列构建二叉树,并求出二叉树的结点数、叶子结点数和高度。下面是 C 语言的代码实现,供你参考:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
char val; // 结点值
struct TreeNode* left; // 左子结点
struct TreeNode* right; // 右子结点
} TreeNode;
// 根据先序扩展序列构建二叉树的函数
TreeNode* buildTree(char* s, int* i) {
if (s[*i] == '#' || s[*i] == '\0') { // 空结点返回 NULL
(*i)++;
return NULL;
}
TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode)); // 创建结点
node->val = s[(*i)++];
node->left = buildTree(s, i); // 递归构建左子树
node->right = buildTree(s, i); // 递归构建右子树
return node;
}
// 求二叉树结点数的函数
int countNodes(TreeNode* root) {
if (root == NULL) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
// 求二叉树叶子结点数的函数
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);
}
// 求二叉树高度的函数
int getHeight(TreeNode* root) {
if (root == NULL) {
return 0;
}
int leftHeight = getHeight(root->left); // 求左子树高度
int rightHeight = getHeight(root->right); // 求右子树高度
return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
}
// 主函数
int main() {
char s[100];
printf("请输入先序扩展序列:\n");
scanf("%s", s);
int i = 0;
TreeNode* root = buildTree(s, &i); // 构建二叉树
int nodes = countNodes(root); // 求结点数
int leaves = countLeaves(root); // 求叶子结点数
int height = getHeight(root); // 求二叉树高度
printf("结点数:%d\n", nodes);
printf("叶子结点数:%d\n", leaves);
printf("二叉树高度:%d\n", height);
return 0;
}
```
输入先序扩展序列后,程序会自动构建二叉树,并输出二叉树的结点数、叶子结点数和高度。注意,输入的字符串长度不能超过 100。
阅读全文