用C语言编写一个完整的程序,利用二叉树的递归遍历算法,编写函数,实现二叉树{3,4,5,6,8,10,12,18}的结点数、叶子结点数、树的高度、以及每层结点数的计算
时间: 2024-12-24 20:18:40 浏览: 15
在C语言中,我们可以使用结构体来表示二叉树节点,并实现递归遍历算法来计算相关的属性。下面是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建一个新的二叉树节点
TreeNode* createNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入节点到二叉搜索树
TreeNode* insert(TreeNode* root, int val) {
if (!root) {
return createNode(val);
}
if (val < root->val) {
root->left = insert(root->left, val);
} else {
root->right = insert(root->right, val);
}
return root;
}
// 计算二叉树节点总数
int countNodes(TreeNode* root) {
if (!root) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
// 判断是否为叶子节点
int isLeaf(TreeNode* node) {
return !node->left && !node->right;
}
// 计算叶子节点数
int leafCount(TreeNode* root) {
if (!root) {
return 0;
}
return isLeaf(root) ? 1 : leafCount(root->left) + leafCount(root->right);
}
// 递归计算树的高度
int height(TreeNode* root) {
if (!root) {
return 0;
}
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;
}
// 计算每层节点数
void printLevelOrder(TreeNode* root) {
if (!root) return;
int level[100], cnt = 0, levelIndex = 0;
printLevelOrderUtil(root, level, &cnt, &levelIndex);
}
void printLevelOrderUtil(TreeNode* node, int level[], int& cnt, int& levelIndex) {
if (!node) return;
level[levelIndex++] = cnt++;
printLevelOrderUtil(node->left, level, cnt, levelIndex);
printLevelOrderUtil(node->right, level, cnt, levelIndex);
}
int main() {
// 插入给定的元素创建二叉搜索树
TreeNode* root = NULL;
root = insert(root, 3);
insert(root, 4);
insert(root, 5);
insert(root, 6);
insert(root, 8);
insert(root, 10);
insert(root, 12);
insert(root, 18);
printf("Total nodes: %d\n", countNodes(root));
printf("Leaf nodes: %d\n", leafCount(root));
printf("Tree height: %d\n", height(root));
// 输出每层节点数
printf("\nLevel Order:\n");
printLevelOrder(root);
return 0;
}
```
这个程序首先创建了一个二叉搜索树,然后通过递归遍历计算了结点数、叶子结点数和高度,并实现了打印每层节点数的功能。运行`main()`函数即可看到结果。
阅读全文