从键盘输入n个数据建立n元完全二叉树顺序存储结构。实现该完全二叉树的先、中、后序遍历
时间: 2024-12-12 22:19:20 浏览: 18
要实现从键盘输入n个数据建立n元完全二叉树的顺序存储结构,并提供先序、中序和后续遍历,我们首先需要创建一个数组来存储数据,然后根据完全二叉树的性质构建树结构。这里我会给出关键步骤和代码示例。
1. 完全二叉树的性质:最后一个节点要么没有左孩子,要么没有右孩子。我们可以使用两个指针 `root` 和 `last` 分别指向根节点和最后一个非空节点来构造。
2. 先序遍历(根-左-右):
- 从根开始访问
- 对于每个节点,先访问自身,然后递归地访问左子树(如果存在),最后访问右子树(如果存在)
3. 中序遍历(左-根-右):
- 从左子节点开始,直到遇到根节点
- 访问根节点
- 对右子树进行同样的操作
4. 后序遍历(左-右-根):
- 首先对左子树进行遍历
- 然后对右子树进行遍历
- 最后访问根节点
下面是伪代码和C语言示例:
```c
#include <stdio.h>
// 定义一个结构体表示结点
typedef struct Node {
int data;
struct Node* left, *right;
} Node;
// 创建一个新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// 构建完全二叉树
Node* buildCompleteBT(int arr[], int n, int& root, int last) {
if (n <= 0)
return NULL;
// 根节点为第一个非空位置
root = arr[last--];
Node* node = createNode(root);
if (n == 1)
return node;
int mid = last / 2 + 1; // 计算中间位置
node->left = buildCompleteBT(arr, n / 2, node->left, mid);
node->right = buildCompleteBT(arr, n - n / 2, node->right, last);
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 main() {
int n, i;
printf("Enter the number of nodes: ");
scanf("%d", &n);
int arr[n]; // 顺序存储的数组
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
Node* root = NULL;
int last = n - 1; // 最后一个非空节点的位置
root = buildCompleteBT(arr, n, root, last);
printf("\nPreorder traversal:\n");
preOrder(root);
printf("\nInorder traversal:\n");
inOrder(root);
printf("\nPostorder traversal:\n");
postOrder(root);
return 0;
}
```
执行这段代码,你可以输入n个整数,然后按照先序、中序和后序的方式输出它们在完全二叉树中的顺序。记得在运行时定义足够的内存空间用于存储树节点。
阅读全文