用C语言创建并存储一颗二叉树,然后输出二叉树的先序遍历,中序遍历,后序遍历和层次遍历序列
时间: 2024-12-01 10:29:11 浏览: 3
在C语言中,我们可以使用结构体表示二叉树节点,并通过递归算法实现遍历。首先,定义一个二叉树节点结构:
```c
struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左子树指针
struct TreeNode* right; // 右子树指针
};
```
接下来,我们分别编写函数来创建二叉树、先序遍历、中序遍历、后序遍历和层次遍历:
### 创建二叉树(例如插入一个元素到根节点)
```c
void insertNode(struct TreeNode** root, int val) {
if (*root == NULL) {
*root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
(*root)->val = val;
(*root)->left = (*root)->right = NULL;
} else if (val < (*root)->val) {
insertNode(&(*root)->left, val);
} else {
insertNode(&(*root)->right, val);
}
}
```
### 先序遍历(根-左-右)
```c
void preorderTraversal(struct TreeNode* node, int arr[]) {
if (node != NULL) {
arr[preorderCount++] = node->val;
preorderTraversal(node->left, arr);
preorderTraversal(node->right, arr);
}
}
// 示例调用
int preorder[] = {0};
int preorderCount = 0;
insertNode(&root, 5); // 根据需要插入其他节点
preorderTraversal(root, preorder);
```
### 中序遍历(左-根-右)
```c
void inorderTraversal(struct TreeNode* node, int arr[]) {
if (node != NULL) {
inorderTraversal(node->left, arr);
arr[inorderCount++] = node->val;
inorderTraversal(node->right, arr);
}
}
// 示例调用
int inorder[] = {0};
inorderCount = 0;
preorderTraversal(root, inorder);
```
### 后序遍历(左-右-根)
```c
void postorderTraversal(struct TreeNode* node, int arr[]) {
if (node != NULL) {
postorderTraversal(node->left, arr);
postorderTraversal(node->right, arr);
arr[postorderCount++] = node->val;
}
}
// 示例调用
int postorder[] = {0};
postorderCount = 0;
postorderTraversal(root, postorder);
```
### 层次遍历(使用队列)
```c
void levelOrderTraversal(struct TreeNode* root, int arr[], int levels[]) {
int level = 0, index = 0;
queue struct TreeNode* q = {NULL};
if (root) {
q.first = q.last = &q.array[0];
q.size = 1;
q.array[0] = root;
while (!queueEmpty(q)) {
struct TreeNode* current = queueDequeue(q);
arr[index++] = current->val;
if (current->left) {
queueEnqueue(&q, current->left);
}
if (current->right) {
queueEnqueue(&q, current->right);
}
}
levels[level++] = index;
}
levels[level] = 0; // 结束标志
}
// 示例调用
int levels[] = {0};
levelOrderTraversal(root, preorder, levels);
```
以上代码中,`queueEnqueue`、`queueDequeue` 和 `queueEmpty` 是自定义的队列操作,这里未给出。你可以根据需求自行实现或者使用现成的数据结构库。
阅读全文