C语言编写函数利用二叉树的递归遍历算法,编写函数,实现二叉树的结点数、叶子结点数、树的高度、层结点数的计算。
时间: 2024-12-24 20:18:42 浏览: 24
在C语言中,我们可以使用递归的方式实现二叉树的遍历以及相关的计数操作。这里我会分别介绍如何计算节点总数、叶子节点数、树的高度以及每层的节点数。
1. **节点总数** (Node count):
```c
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int countNodes(TreeNode* root) {
if (root == NULL) return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
```
这个`countNodes`函数通过检查每个节点是否为空来累加所有节点的数量。
2. **叶子节点数** (Leaf node count):
```c
int leafCount(TreeNode* root) {
if (root == NULL || (root->left == NULL && root->right == NULL)) return 1; // 叶子节点条件
else return 0 + leafCount(root->left) + leafCount(root->right);
}
```
这里我们判断一个节点是否为叶子节点(即无左孩子也无右孩子)。
3. **树的高度** (Tree height):
```c
int treeHeight(TreeNode* root) {
if (root == NULL) return 0;
int leftHeight = treeHeight(root->left);
int rightHeight = treeHeight(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
```
高度计算采用递归方式,每次比较左右子树的最大高度,并加一。
4. **层次遍历并计算各层节点数** (Level-wise node count):
```c
void printLevelwise(TreeNode* root, int level, int nodes[]) {
if (root == NULL) return;
if (nodes[level - 1] < 0) { // 检查数组大小,避免越界
printf("Level %d: ", level);
nodes[level - 1] = 1;
} else {
nodes[level - 1]++;
}
printLevelwise(root->left, level + 1, nodes);
printLevelwise(root->right, level + 1, nodes);
}
// 需要在主函数里动态分配数组并初始化
int getLevels(TreeNode* root) {
int levels[] = {0};
printLevelwise(root, 1, levels);
return sizeof(levels) / sizeof(levels[0]);
}
```
`printLevelwise`函数用于按层打印节点,`getLevels`函数则调用它并返回层数。
阅读全文