如何让一个二叉树指针指向的节点入队且用c语言代码实现实现层次遍历时并把每一层隔开
时间: 2024-05-03 18:22:23 浏览: 13
假设我们已经有了一个二叉树的队列,并且已经实现了二叉树的层次遍历算法。现在需要实现将一个指向二叉树节点的指针入队的功能。
具体实现步骤如下:
1. 判断队列是否为空,如果为空则创建一个新的队列。
2. 将指向节点的指针入队。
3. 在队列中加入一个空指针,表示当前层已经遍历完毕。
4. 遍历队列,当遍历到空指针时,将队列中的下一个节点作为下一层的第一个节点。
具体的C语言代码实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct QueueNode {
struct TreeNode *treeNode;
struct QueueNode *next;
};
struct Queue {
struct QueueNode *front;
struct QueueNode *rear;
};
void enqueue(struct Queue *queue, struct TreeNode *treeNode) {
struct QueueNode *newNode = (struct QueueNode *)malloc(sizeof(struct QueueNode));
newNode->treeNode = treeNode;
newNode->next = NULL;
if (queue->rear == NULL) {
queue->front = newNode;
queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
struct TreeNode *dequeue(struct Queue *queue) {
if (queue->front == NULL) {
return NULL;
}
struct TreeNode *treeNode = queue->front->treeNode;
struct QueueNode *temp = queue->front;
if (queue->front == queue->rear) {
queue->front = NULL;
queue->rear = NULL;
} else {
queue->front = queue->front->next;
}
free(temp);
return treeNode;
}
void printLevelOrder(struct TreeNode *root) {
struct Queue *queue = (struct Queue *)malloc(sizeof(struct Queue));
queue->front = NULL;
queue->rear = NULL;
if (root == NULL) {
return;
}
enqueue(queue, root);
enqueue(queue, NULL);
while (queue->front != NULL) {
struct TreeNode *treeNode = dequeue(queue);
if (treeNode == NULL) {
printf("\n");
if (queue->front != NULL) {
enqueue(queue, NULL);
}
} else {
printf("%d ", treeNode->val);
if (treeNode->left != NULL) {
enqueue(queue, treeNode->left);
}
if (treeNode->right != NULL) {
enqueue(queue, treeNode->right);
}
}
}
}
int main() {
struct TreeNode *root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->val = 1;
struct TreeNode *node1 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node1->val = 2;
struct TreeNode *node2 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node2->val = 3;
struct TreeNode *node3 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node3->val = 4;
struct TreeNode *node4 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node4->val = 5;
root->left = node1;
root->right = node2;
node1->left = node3;
node1->right = NULL;
node2->left = node4;
node2->right = NULL;
node3->left = NULL;
node3->right = NULL;
node4->left = NULL;
node4->right = NULL;
printLevelOrder(root);
enqueue(queue, node1);
enqueue(queue, NULL);
enqueue(queue, node2);
return 0;
}
```
在这个代码中,我们首先定义了一个队列结构体,包含指向队首和队尾的指针。enqueue和dequeue函数用于将节点入队和出队。
在printLevelOrder函数中,我们先将根节点入队,然后加入一个空指针,表示当前层已经遍历完毕。在遍历队列时,当遇到空指针时,我们将队列中的下一个节点作为下一层的第一个节点,并在队列中加入一个新的空指针,表示下一层已经遍历完毕。如果遇到非空节点,我们将其左右子节点入队。最后,我们调用printLevelOrder函数测试我们的enqueue函数是否正确。