一、实验目标 1.熟悉二叉树的链式存储结构特性; 2.掌握二叉树——能够用C语言实现二叉树的各种基本操作。 二、实验内容 实现二叉树的基本操作: (1)实现二叉树的创建功能; (2)实现遍历功能,先序、中序、后序,选择其中一种;打印出遍历序列; (3)实现“结点的度”的统计功能;输出每个结点的度; (4)计算树的深度。 三、测试数据 用于测试的二叉树为: 注意: (1)图中的灰色结点是不存在的; (2)结点“圆圈”中的数字,即为其所存储的数据; (3)采用链式存储而不是顺序存储方式; (4)在输出结点的度时,可用结点的值标识该结点(图示中每个结点所存数据已设定为各自不同);例如,13:2,即表示(13)这个结点的度为2. (5)树的创建时,采用交互方式(键盘)输入树的数据。
时间: 2023-11-27 08:53:35 浏览: 131
好的,这是一个二叉树的实验,需要实现二叉树的创建、遍历、统计结点度和计算树的深度功能。下面我将逐一为您介绍如何实现这些功能。
1. 实现二叉树的创建功能
二叉树的创建可以采用递归方法,即每次输入一个结点的值,然后递归创建该结点的左子树和右子树。具体实现方式如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node;
Node* createTree() {
Node *node;
int data;
printf("请输入结点的值(-1表示该结点为空):");
scanf("%d", &data);
if (data == -1) {
node = NULL;
} else {
node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = createTree();
node->right = createTree();
}
return node;
}
```
2. 实现遍历功能
遍历二叉树有三种方式:先序遍历、中序遍历和后序遍历。下面分别介绍实现方法。
先序遍历:
```c
void preOrder(Node *node) {
if (node != NULL) {
printf("%d ", node->data);
preOrder(node->left);
preOrder(node->right);
}
}
```
中序遍历:
```c
void inOrder(Node *node) {
if (node != NULL) {
inOrder(node->left);
printf("%d ", node->data);
inOrder(node->right);
}
}
```
后序遍历:
```c
void postOrder(Node *node) {
if (node != NULL) {
postOrder(node->left);
postOrder(node->right);
printf("%d ", node->data);
}
}
```
3. 实现“结点的度”的统计功能
结点的度是指一个结点的子节点个数。因此,统计结点的度需要遍历整棵树,对于每个结点,统计出其左子树和右子树的节点数即可。
```c
int getDegree(Node *node) {
if (node == NULL) {
return 0;
} else {
int leftDegree = getDegree(node->left);
int rightDegree = getDegree(node->right);
return (node->left != NULL) + (node->right != NULL) + leftDegree + rightDegree;
}
}
```
4. 计算树的深度
计算树的深度也需要遍历整棵树,对于每个结点,计算出其左子树和右子树的深度,然后取较大值加1即可。
```c
int getDepth(Node *node) {
if (node == NULL) {
return 0;
} else {
int leftDepth = getDepth(node->left);
int rightDepth = getDepth(node->right);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
```
整个程序的完整代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node;
Node* createTree() {
Node *node;
int data;
printf("请输入结点的值(-1表示该结点为空):");
scanf("%d", &data);
if (data == -1) {
node = NULL;
} else {
node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = createTree();
node->right = createTree();
}
return node;
}
void preOrder(Node *node) {
if (node != NULL) {
printf("%d ", node->data);
preOrder(node->left);
preOrder(node->right);
}
}
void inOrder(Node *node) {
if (node != NULL) {
inOrder(node->left);
printf("%d ", node->data);
inOrder(node->right);
}
}
void postOrder(Node *node) {
if (node != NULL) {
postOrder(node->left);
postOrder(node->right);
printf("%d ", node->data);
}
}
int getDegree(Node *node) {
if (node == NULL) {
return 0;
} else {
int leftDegree = getDegree(node->left);
int rightDegree = getDegree(node->right);
return (node->left != NULL) + (node->right != NULL) + leftDegree + rightDegree;
}
}
int getDepth(Node *node) {
if (node == NULL) {
return 0;
} else {
int leftDepth = getDepth(node->left);
int rightDepth = getDepth(node->right);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
int main() {
Node *root = createTree();
printf("先序遍历结果:");
preOrder(root);
printf("\n中序遍历结果:");
inOrder(root);
printf("\n后序遍历结果:");
postOrder(root);
printf("\n结点的度:\n");
printf("%d:%d\n", root->data, getDegree(root));
printf("%d:%d\n", root->left->data, getDegree(root->left));
printf("%d:%d\n", root->right->data, getDegree(root->right));
printf("%d:%d\n", root->left->left->data, getDegree(root->left->left));
printf("%d:%d\n", root->left->right->data, getDegree(root->left->right));
printf("树的深度:%d\n", getDepth(root));
return 0;
}
```
希望这个程序对您有所帮助!
阅读全文