用C语言实现利用二叉树的递归遍历算法,编写函数,实现二叉树的结点数、叶子结点数、树的高度、以及每层结点数的计算。要有思路、源码、运行结果及结论、
时间: 2023-11-27 08:03:44 浏览: 143
思路:
本问题需要实现以下四个功能:
1. 求二叉树的结点数:对于每个非空的结点,其结点数等于左子树的结点数加右子树的结点数再加1。
2. 求二叉树的叶子结点数:对于每个非空的结点,如果它的左右子树都为空,则其是叶子结点。
3. 求二叉树的高度:对于每个非空的结点,其高度等于左右子树的高度中的最大值再加1。
4. 求二叉树每层的结点数:可以使用递归的方式,对于每一层,先遍历左子树,再遍历右子树,记录下每一层的结点数。
源码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建二叉树
TreeNode* createTree() {
int val;
scanf("%d", &val);
if (val == -1) return NULL;
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = val;
root->left = createTree();
root->right = createTree();
return root;
}
// 求二叉树结点数
int countNodes(TreeNode *root) {
if (root == NULL) return 0;
return countNodes(root->left) + countNodes(root->right) + 1;
}
// 求二叉树叶子结点数
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 (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
// 求二叉树每层的结点数
void countNodesByLevel(TreeNode *root, int level, int *count) {
if (root == NULL) return;
count[level]++;
countNodesByLevel(root->left, level+1, count);
countNodesByLevel(root->right, level+1, count);
}
int main() {
TreeNode *root = createTree();
printf("二叉树结点数:%d\n", countNodes(root));
printf("二叉树叶子结点数:%d\n", countLeaves(root));
printf("二叉树高度:%d\n", getHeight(root));
int count[100] = {0};
countNodesByLevel(root, 0, count);
printf("二叉树每层的结点数:\n");
for (int i = 0; i < 100; i++) {
if (count[i] == 0) break;
printf("第%d层有%d个结点\n", i+1, count[i]);
}
return 0;
}
```
运行结果:
输入:1 2 -1 -1 3 4 -1 -1 5 -1 -1
输出:
```
二叉树结点数:5
二叉树叶子结点数:3
二叉树高度:3
二叉树每层的结点数:
第1层有1个结点
第2层有2个结点
第3层有2个结点
```
结论:
通过以上代码,我们可以实现二叉树的结点数、叶子结点数、树的高度、以及每层结点数的计算。可以发现,在递归遍历二叉树的过程中,我们可以轻松地实现以上四个功能。
阅读全文