C语言二叉树层次遍历
时间: 2023-11-23 09:08:11 浏览: 100
C语言二叉树的层次遍历是一种广度优先搜索算法,它按照从上到下、从左到右的顺序遍历二叉树的每个节点。具体操作如下:
1. 创建一个队列,并将根节点入队。
2. 当队列不为空时,执行以下步骤:
- 出队一个节点,并访问该节点。
- 如果该节点有左子节点,则将左子节点入队。
- 如果该节点有右子节点,则将右子节点入队。
3. 重复步骤2,直到队列为空。
这样,就可以按层次遍历的顺序访问二叉树的所有节点。
相关问题
c语言二叉树层次遍历
你可以使用队列来实现二叉树的层次遍历。以下是一个使用C语言的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新的二叉树节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败!\n");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 层次遍历二叉树
void levelOrderTraversal(Node* root) {
if (root == NULL) {
return;
}
// 创建一个队列用于存储节点指针
Node** queue = (Node**)malloc(sizeof(Node*) * 100);
int front = 0; // 队列的前指针,指向队首元素
int rear = 0; // 队列的后指针,指向队尾元素的下一个位置
// 将根节点入队
queue[rear++] = root;
while (front < rear) {
// 出队并访问当前节点
Node* currentNode = queue[front++];
printf("%d ", currentNode->data);
// 将当前节点的左右子节点入队
if (currentNode->left != NULL) {
queue[rear++] = currentNode->left;
}
if (currentNode->right != NULL) {
queue[rear++] = currentNode->right; }
}
// 释放队列内存
free(queue);
}
int main() {
// 创建二叉树
Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
// 层次遍历二叉树并输出结果
printf("层次遍历结果:");
levelOrderTraversal(root);
printf("\n");
// 释放二叉树内存
free(root->left->left);
free(root->left->right);
free(root->left);
free(root->right);
free(root);
return 0;
}
```
该代码创建了一个二叉树,并使用队列实现了层次遍历。层次遍历会从上往下、从左往右依次访问二叉树的每个节点,并输出节点的数据值。
c语言二叉树层次遍历和中序遍历完整代码
以下是C语言二叉树层次遍历和中序遍历的完整代码:
1. 二叉树层次遍历
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode, *BiTree;
// 根据中序遍历和层次遍历构建二叉树
void BuildTree(char *level, char *inorder, BiTree *T) {
int i;
int len = strlen(level); // 取得层次遍历长度
int pos;
if (len == 0) return;
char *p = strchr(inorder, level[0]);
if (p == NULL) // 如果为空则...
return;
pos = p - inorder; // 取得根节点在中序遍历中的位置
(*T) = (TreeNode *)malloc(sizeof(TreeNode));
(*T)->data = level[0];
(*T)->left = NULL;
(*T)->right = NULL;
BuildTree(level + 1, inorder, &((*T)->left)); // 递归构建左子树
BuildTree(level + pos + 1, p + 1, &((*T)->right)); // 递归构建右子树
}
// 层次遍历
void LevelOrder(BiTree T) {
BiTree queue[1000];
int front = 0, rear = 0;
if (T == NULL) return;
queue[rear++] = T;
while (front != rear) {
BiTree p = queue[front++];
printf("%c ", p->data);
if (p->left != NULL) queue[rear++] = p->left;
if (p->right != NULL) queue[rear++] = p->right;
}
}
int main() {
char level[] = "ABDECFG";
char inorder[] = "DBEAFCG";
BiTree T = NULL;
BuildTree(level, inorder, &T);
printf("层次遍历结果:");
LevelOrder(T);
return 0;
}
```
2. 二叉树中序遍历
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode, *BiTree;
// 根据中序遍历和层次遍历构建二叉树
void BuildTree(char *level, char *inorder, BiTree *T) {
int i;
int len = strlen(level); // 取得层次遍历长度
int pos;
if (len == 0) return;
char *p = strchr(inorder, level[0]);
if (p == NULL) // 如果为空则...
return;
pos = p - inorder; // 取得根节点在中序遍历中的位置
(*T) = (TreeNode *)malloc(sizeof(TreeNode));
(*T)->data = level[0];
(*T)->left = NULL;
(*T)->right = NULL;
BuildTree(level + 1, inorder, &((*T)->left)); // 递归构建左子树
BuildTree(level + pos + 1, p + 1, &((*T)->right)); // 递归构建右子树
}
// 中序遍历
void InOrder(BiTree T) {
if (T == NULL) return;
InOrder(T->left);
printf("%c ", T->data);
InOrder(T->right);
}
int main() {
char level[] = "ABDECFG";
char inorder[] = "DBEAFCG";
BiTree T = NULL;
BuildTree(level, inorder, &T);
printf("中序遍历结果:");
InOrder(T);
return 0;
}
```
阅读全文