题目描述 给你一个二叉树,请你按照层次遍历输出该二叉树。二叉树的输入形式见下面的提示。 输入 第一行为n,表示二叉树的数组长度1≤n≤100;第二行为树的数组形式,当tree[i] = 0时,表示为空结点。 输出 二叉树的层次遍历。 样例输入 Copy 7 3 9 20 0 0 15 7 样例输出 Copy 3 9 20 15 7 提示 本题给出的是二叉树的数组形式。数组形式的特点:如果当前节点在数组中的下标为root,那么它的左儿子在数组中的下标为root*2,它的右儿子在数组中的下标为root*2+1; 假设给出的二叉树为3 9 20 0 0 15 7(0表示是空结点),并且当前结点root的下标为1,那么它的左儿子的下标为root*2 = 2即tree[2] = 9, 右儿子的下标为root*2+1=3即tree[3] = 20;root的右儿子的左儿子的编号为3 * 2 = 6即tree[6] = 15,右儿子为3 * 2 + 1 = 7即tree[7] = 7;通过这个关系我们就能使用数组建立树的关系了。建树如下所示: 3 / \ 9 20 / \ 15 7帮我用C语言写
时间: 2024-02-27 15:51:19 浏览: 70
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
```
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
typedef struct QueueNode {
TreeNode* treeNode;
struct QueueNode* next;
} QueueNode;
typedef struct {
QueueNode* front;
QueueNode* rear;
} Queue;
void initQueue(Queue* queue) {
queue->front = queue->rear = NULL;
}
int isQueueEmpty(Queue* queue) {
return queue->front == NULL;
}
void enqueue(Queue* queue, TreeNode* treeNode) {
QueueNode* qNode = (QueueNode*)malloc(sizeof(QueueNode));
qNode->treeNode = treeNode;
qNode->next = NULL;
if (isQueueEmpty(queue)) {
queue->front = queue->rear = qNode;
} else {
queue->rear->next = qNode;
queue->rear = qNode;
}
}
TreeNode* dequeue(Queue* queue) {
if (isQueueEmpty(queue)) {
return NULL;
}
QueueNode* qNode = queue->front;
TreeNode* treeNode = qNode->treeNode;
queue->front = qNode->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(qNode);
return treeNode;
}
TreeNode* createTreeNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
TreeNode* createTreeFromArray(int* array, int size) {
TreeNode** nodes = (TreeNode**)malloc(sizeof(TreeNode*) * size);
for (int i = 0; i < size; i++) {
if (array[i] == 0) {
nodes[i] = NULL;
} else {
nodes[i] = createTreeNode(array[i]);
}
}
for (int i = 0; i < size; i++) {
if (nodes[i] == NULL) {
continue;
}
if (2 * i + 1 < size) {
nodes[i]->left = nodes[2 * i + 1];
}
if (2 * i + 2 < size) {
nodes[i]->right = nodes[2 * i + 2];
}
}
TreeNode* root = nodes[0];
free(nodes);
return root;
}
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
Queue queue;
initQueue(&queue);
enqueue(&queue, root);
while (!isQueueEmpty(&queue)) {
TreeNode* node = dequeue(&queue);
printf("%d ", node->val);
if (node->left != NULL) {
enqueue(&queue, node->left);
}
if (node->right != NULL) {
enqueue(&queue, node->right);
}
}
}
int main() {
int n;
scanf("%d", &n);
int* array = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf("%d", &array[i]);
}
TreeNode* root = createTreeFromArray(array, n);
levelOrderTraversal(root);
free(array);
return 0;
}
```
阅读全文