以下图为例:
左边表示二叉树 右边表示队列
实现方法:
将根结点放入队列
while(只要队列不为空)
{
打印队列中第一个结点 在二叉树中找到这个结点 并将这个结点的左右孩子放在队列末尾 删除这个结点
}
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#pragma warning (disable:4996)
typedef struct Node
{
struct Node*left;
struct Node*right;
int value;
}Node;
Node* CreatNode(int v)
{
Node*node = (Node*)malloc(sizeof(Node));
node->value = v;
node->left = NULL;
node->right = NULL;
return node;
}
typedef struct QueueNode
{
struct QueueNode* next;
Node* data;
}QueueNode;
typedef struct Queue
{
QueueNode* _front; // 队头
QueueNode* _rear; // 队尾
}Queue;
void QueueInit(Queue* pq)
{
pq->_front = NULL;
pq->_rear = NULL;
}
QueueNode* BuyQueueNode(Node*data)
{
QueueNode*newnode = (QueueNode*)malloc(sizeof(QueueNode));
assert(newnode);
newnode->data = data;
newnode->next = NULL;
return newnode;
}
void QueuePush(Queue* pq, Node*data)
{
QueueNode*cur = BuyQueueNode(data);
if (pq->_front == NULL)
{
pq->_front = cur;
pq->_rear = cur;
}
else
{
pq->_rear->next = cur;
pq->_rear = cur;
}
}
void QueuePop(Queue* pq)
{
if (pq->_front == NULL)
return;
if (pq->_front->next == NULL)
{
free(pq->_rear);
pq->_front = NULL;
pq->_rear = NULL;
return;
}
QueueNode*cur = pq->_front->next;
free(pq->_front);
pq->_front = cur;
return;
}
void QueuePrint(Queue*pq)
{
QueueNode*cur = pq->_front;
for (cur; cur != NULL; cur = cur->next)
{
printf("%d ", cur->data);
}
}
void PrintFirst(Queue*pq)
{
printf("%d ", pq->_front->data->value);
}
void LevelOredr(Node*root)
{
Queue myqueue;
QueueInit(&myqueue);
if (root != NULL)
QueuePush(&myqueue, root);
while (myqueue._front)
{
PrintFirst(&myqueue);
Node*cur = myqueue._front->data;
QueuePop(&myqueue);
if (cur->left)
QueuePush(&myqueue, cur->left);
if (cur->right)
QueuePush(&myqueue, cur->right);
}
printf("\n");
}
void test()
{
Node*a = CreatNode(1);
Node*b = CreatNode(2);
Node*c = CreatNode(3);
Node*d = CreatNode(4);
Node*e = CreatNode(5);
Node*f = CreatNode(6);
Node*g = CreatNode(7);
Node*h = CreatNode(8);
a->left = b; a->right = c;
b->left = d; b->right = e;
c->left = f; c->right = g;
g->left = h;
LevelOredr(a);
}
int main()
{
test();
system("pause");
return 0;
}