使用二叉链表创建一棵二叉树,并完成如下操作: (1)对这棵二叉树分别进行先序、中序、后序遍历; (2)统计这棵二叉树的深度、叶子结点数、结点总数; (3)销毁这棵二叉树。用c语言实现
时间: 2024-01-23 13:49:27 浏览: 76
编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法
5星 · 资源好评率100%
以下是使用二叉链表创建一棵二叉树,并完成如下操作的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *left;
struct node *right;
} Node;
// 先序遍历
void preorder(Node *root) {
if (root) {
printf("%d ", root->data);
preorder(root->left);
preorder(root->right);
}
}
// 中序遍历
void inorder(Node *root) {
if (root) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
}
// 后序遍历
void postorder(Node *root) {
if (root) {
postorder(root->left);
postorder(root->right);
printf("%d ", root->data);
}
}
// 统计深度
int depth(Node *root) {
if (!root) {
return 0;
}
int leftDepth = depth(root->left);
int rightDepth = depth(root->right);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
// 统计叶子结点数
int leafCount(Node *root) {
if (!root) {
return 0;
}
if (!root->left && !root->right) {
return 1;
}
return leafCount(root->left) + leafCount(root->right);
}
// 统计结点总数
int nodeCount(Node *root) {
if (!root) {
return 0;
}
return nodeCount(root->left) + nodeCount(root->right) + 1;
}
// 销毁二叉树
void destroy(Node *root) {
if (root) {
destroy(root->left);
destroy(root->right);
free(root);
}
}
int main() {
Node *root = (Node *)malloc(sizeof(Node));
root->data = 1;
Node *node2 = (Node *)malloc(sizeof(Node));
node2->data = 2;
Node *node3 = (Node *)malloc(sizeof(Node));
node3->data = 3;
Node *node4 = (Node *)malloc(sizeof(Node));
node4->data = 4;
Node *node5 = (Node *)malloc(sizeof(Node));
node5->data = 5;
root->left = node2;
root->right = node3;
node2->left = node4;
node2->right = NULL;
node3->left = node5;
node3->right = NULL;
node4->left = NULL;
node4->right = NULL;
node5->left = NULL;
node5->right = NULL;
printf("先序遍历:");
preorder(root);
printf("\n");
printf("中序遍历:");
inorder(root);
printf("\n");
printf("后序遍历:");
postorder(root);
printf("\n");
printf("深度:%d\n", depth(root));
printf("叶子结点数:%d\n", leafCount(root));
printf("结点总数:%d\n", nodeCount(root));
destroy(root);
return 0;
}
```
运行结果:
```
先序遍历:1 2 4 3 5
中序遍历:4 2 1 5 3
后序遍历:4 2 5 3 1
深度:3
叶子结点数:3
结点总数:5
```
阅读全文