该问题要求设计程序,利用二叉链表结构,建立一棵二叉树。并能递归实现二叉树的先序遍历、中序遍历和后序遍历三种遍历算法,能用队列实现二叉树的层次遍历算法,并按层次输出(标出层号),并能统计树叶数,结点数,层高等信息。要求用c语言写
时间: 2023-10-10 14:05:14 浏览: 76
以下是一个示例程序,用C语言实现了二叉树的建立、先序遍历、中序遍历、后序遍历、层次遍历和统计树叶数、结点数、层高等功能。
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点结构体
typedef struct TreeNode {
int data; // 结点数据
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode;
// 二叉树结构体
typedef struct BinaryTree {
TreeNode *root; // 根结点指针
} BinaryTree;
// 递归实现先序遍历
void preOrder(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 递归实现中序遍历
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);
}
// 利用队列实现层次遍历
void levelOrder(BinaryTree *tree) {
if (tree == NULL || tree->root == NULL) {
return;
}
Queue *queue = createQueue(); // 创建队列
enqueue(queue, tree->root); // 根结点入队
int level = 0; // 层号初始化为0
while (!isEmpty(queue)) {
level++; // 进入下一层
printf("Level %d: ", level); // 输出层号
int levelSize = getSize(queue); // 当前层结点数
for (int i = 0; i < levelSize; i++) {
TreeNode *node = dequeue(queue); // 出队一个结点
printf("%d ", node->data); // 输出结点数据
if (node->left != NULL) {
enqueue(queue, node->left); // 左子树结点入队
}
if (node->right != NULL) {
enqueue(queue, node->right); // 右子树结点入队
}
}
printf("\n");
}
destroyQueue(queue); // 销毁队列
}
// 递归实现统计叶子结点数
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 countNodes(TreeNode *root) {
if (root == NULL) {
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
// 递归实现统计二叉树的层数
int countLevels(TreeNode *root) {
if (root == NULL) {
return 0;
}
int leftLevels = countLevels(root->left);
int rightLevels = countLevels(root->right);
return (leftLevels > rightLevels ? leftLevels : rightLevels) + 1;
}
// 创建一个新的结点
TreeNode *createNode(int data) {
TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 递归实现向二叉树中插入新结点
void insertNode(TreeNode **root, int data) {
if (*root == NULL) {
*root = createNode(data);
return;
}
if (data < (*root)->data) {
insertNode(&((*root)->left), data);
} else {
insertNode(&((*root)->right), data);
}
}
// 创建一个新的二叉树
BinaryTree *createTree() {
BinaryTree *tree = (BinaryTree *) malloc(sizeof(BinaryTree));
tree->root = NULL;
return tree;
}
// 递归实现销毁二叉树
void destroyTree(TreeNode *root) {
if (root == NULL) {
return;
}
destroyTree(root->left);
destroyTree(root->right);
free(root);
}
// 主函数
int main() {
BinaryTree *tree = createTree(); // 创建一个新的二叉树
insertNode(&(tree->root), 5); // 插入结点
insertNode(&(tree->root), 2);
insertNode(&(tree->root), 8);
insertNode(&(tree->root), 1);
insertNode(&(tree->root), 3);
insertNode(&(tree->root), 7);
insertNode(&(tree->root), 9);
printf("Preorder traversal: ");
preOrder(tree->root); // 先序遍历
printf("\n");
printf("Inorder traversal: ");
inOrder(tree->root); // 中序遍历
printf("\n");
printf("Postorder traversal: ");
postOrder(tree->root); // 后序遍历
printf("\n");
printf("Level order traversal:\n");
levelOrder(tree); // 层次遍历
printf("Number of leaves: %d\n", countLeaves(tree->root)); // 统计叶子结点数
printf("Number of nodes: %d\n", countNodes(tree->root)); // 统计结点数
printf("Height of tree: %d\n", countLevels(tree->root)); // 统计层数
destroyTree(tree->root); // 销毁二叉树
return 0;
}
```
以上代码演示了如何使用C语言的二叉链表结构实现二叉树,并且递归实现了二叉树的先序遍历、中序遍历、后序遍历,利用队列实现了二叉树的层次遍历。同时还实现了统计树叶数、结点数、层高等信息的功能。
阅读全文