1.问题描述
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。(来自《剑指offer》)
2.分析
我们可以使用队列这个容器,将元素压入队列,打印时每次从队列中取出一个元素打印其值,并且如果该节点有左孩子或右孩子,在将其左孩子右孩子压入队列,直至队列为空。(这个和有向图的广度优先遍历一个思想,树是图的一种特殊退化形式)。
3.代码
void PrintTreeFromTopToButtom(TreeNode *head,Queue* queue)
{
if(head == NULL || queue == NULL)
{
return;
}
QueueNode *node =(QueueNode*)malloc(sizeof(QueueNode));
node->data = head;
enQueue(queue, node);
while (!isEmpty(queue))
{
TreeNode *node = deQueue(queue)->data;
printf("%d",node->data);
if (node->lChild != NULL)
{
QueueNode *lnode =(QueueNode*)malloc(sizeof(QueueNode));
lnode->data = node->lChild;
enQueue(queue,lnode);
}
if (node->rChild != NULL)
{
QueueNode *rnode =(QueueNode*)malloc(sizeof(QueueNode));
rnode->data = node->rChild;
enQueue(queue, rnode);
}
}
}
队列基于链表实现的
typedef struct node
{
TreeNode* data;
struct node* next;
}QueueNode;
typedef struct queue
{
int size;
QueueNode* head;
}Queue;
void enQueue(Queue* q,QueueNode* node)
{
if (q == NULL || node == NULL)
{
return;
}
q->size ++;
if (q->head == NULL)
{
q->head = node;
return;
}
QueueNode *qNode = q->head;
while (qNode->next != NULL)
{
qNode = qNode->next;
}
qNode ->next = node;
}
QueueNode* deQueue(Queue* q)
{
if (q == NULL || q->head == NULL)
{
return NULL;
}
QueueNode *node = q->head;
q->head = q->head->next;
return node;
}
int isEmpty(Queue* q)
{
if(q == NULL || q->head == NULL || q->size <= 0)
{
return 1;
}
return 0;
}