用C语言编一个完整的程序,输入二叉树的先序数列,输出层序遍历序列
时间: 2024-11-22 10:36:57 浏览: 32
在C语言中,我们可以使用队列数据结构来辅助完成二叉树的层序遍历。以下是一个简单的程序示例,它首先构建一个二叉树,然后通过层序遍历的方式输出节点:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <queue>
// 定义二叉树结点
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建一个新的二叉树节点
TreeNode* createNode(int value) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (!newNode) return NULL;
newNode->val = value;
newNode->left = newNode->right = NULL;
return newNode;
}
// 先序遍历
void preorderTraversal(TreeNode* root, int arr[], int& index) {
if (root == NULL) return;
arr[index++] = root->val; // 记录根节点值
preorderTraversal(root->left, arr, index);
preorderTraversal(root->right, arr, index);
}
// 层次遍历辅助函数
void levelOrderHelper(TreeNode* root, int level, int* arr, bool* visited, int maxLevel) {
if (root == NULL || level >= maxLevel) return;
arr[level] = root->val; // 将当前层次的节点添加到数组中
visited[level] = true;
levelOrderHelper(root->left, level + 1, arr, visited, maxLevel);
levelOrderHelper(root->right, level + 1, arr, visited, maxLevel);
}
// 主函数:接受先序遍历的输入并输出层序遍历结果
void levelOrderTraversal(int* input, int size) {
int n = size;
TreeNode* root = createNode(input[0]); // 根据先序遍历的第一个元素创建根节点
for (int i = 1; i < n; i++) {
if (input[i] != -1) { // 每次找到一个非空节点,插入其左侧
root->left = createNode(input[i]);
root = root->left;
} else { // 当前值为-1,结束当前层级的构造,并开始处理下一个层级
int* arr = (int*)malloc((n + 1) * sizeof(int)); // 预分配足够大的数组
bool* visited = (bool*)malloc((n + 1) * sizeof(bool));
memset(arr, 0, (n + 1) * sizeof(int));
memset(visited, 0, (n + 1) * sizeof(bool));
int maxLevel = 0; // 最大层数
for (int j = 0; j < n; j++) {
if (visited[j]) continue;
maxLevel = j + 1;
break;
}
levelOrderHelper(root, 0, arr, visited, maxLevel);
for (int k = 0; k <= maxLevel; k++) {
printf("%d ", arr[k]); // 输出层序遍历结果
}
free(arr); // 释放数组内存
free(visited); // 释放访问标记数组内存
}
}
}
int main() {
int input[] = {1, 2, 4, -1, 5, 3}; // 示例先序遍历序列
int size = sizeof(input) / sizeof(input[0]);
levelOrderTraversal(input, size);
return 0;
}
```
阅读全文