本专栏持续输出数据结构题目集,欢迎订阅。
题目
请编写程序,创建一棵有 3 个结点的二叉树,并输出其层序遍历序列。
输入格式:
输入给出 3 个整数,依次为二叉树根结点的左孩子、右孩子、根结点本身存储的键值。
输出格式:
输出二叉树的层序遍历序列,每个数字占一行。
输入样例:
1 2 3
输出样例:
3
1
2
代码
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 创建二叉树
TreeNode* createTree(int left_val, int right_val, int root_val) {
TreeNode* root = createNode(root_val);
root->left = createNode(left_val);
root->right = createNode(right_val);
return root;
}
// 定义队列节点结构
typedef struct QueueNode {
TreeNode* node;
struct QueueNode* next;
} QueueNode;
// 定义队列结构
typedef struct {
QueueNode* front;
QueueNode* rear;
} Queue;
// 初始化队列
void initQueue(Queue* q) {
q->front = q->rear = NULL;
}
// 判断队列是否为空
int isEmpty(Queue* q) {
return q->front == NULL;
}
// 入队
void enqueue(Queue* q, TreeNode* node) {
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->node = node;
newNode->next = NULL;
if (isEmpty(q)) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
// 出队
TreeNode* dequeue(Queue* q) {
if (isEmpty(q)) return NULL;
QueueNode* temp = q->front;
TreeNode* node = temp->node;
q->front = q->front->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
return node;
}
// 层序遍历
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) return;
Queue q;
initQueue(&q);
enqueue(&q, root);
while (!isEmpty(&q)) {
TreeNode* current = dequeue(&q);
printf("%d\n", current->data);
if (current->left != NULL) {
enqueue(&q, current->left);
}
if (current->right != NULL) {
enqueue(&q, current->right);
}
}
}
int main() {
int left_val, right_val, root_val;
// 读取输入
scanf("%d %d %d", &left_val, &right_val, &root_val);
// 创建二叉树
TreeNode* root = createTree(left_val, right_val, root_val);
// 层序遍历并输出
levelOrderTraversal(root);
return 0;
}
8070

被折叠的 条评论
为什么被折叠?



