【剑指offer】从上向下打印二叉树
作者:互联网
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26089165
剑指offer上的第23题,实际上就是考察二叉树的层序遍历,详细思想能够參考这里。
- 题目描写叙述:
从上往下打印出二叉树的每一个节点,同层节点从左至右打印。
- 输入:
输入可能包括多个測试例子,输入以EOF结束。
对于每一个測试案例。输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1開始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行。每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子。紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子。紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
- 输出:
相应每一个測试案例,
依照从上之下。从左至右打印出二叉树节点的值。
- 例子输入:
7 8 6 5 7 10 9 11 d 2 5 d 3 4 z z d 6 7 z z
- 例子输出:
8 6 10 5 7 9 11
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
/*
二叉树的存储结构
*/
typedef struct BTNode
{
int data;
int rchild;
int lchild;
}BTNode;
/*
队列的存储结构
*/
typedef struct Node
{
BTNode data;
struct Node *pNext;
}NODE,*PNODE;
typedef struct Queue
{
PNODE front; //队头指针
PNODE rear; //队尾指针
}QUEUE,*PQUEUE;
/*
创建一个空队列,队头指针和队尾指针都指向头结点,
头结点中不存放数据,仅仅存放指针
*/
PQUEUE create_queue()
{
PQUEUE pS = (PQUEUE)malloc(sizeof(QUEUE));
pS->front = (PNODE)malloc(sizeof(NODE));
if(!pS || !pS->front)
{
printf("pS or front malloc failed!!");
exit(-1);
}
else
{
pS->rear = pS->front;
pS->front->pNext = NULL;
}
return pS;
}
/*
推断队列是否为空
*/
bool is_empty(PQUEUE pS)
{
if(pS->front == pS->rear)
return true;
else
return false;
}
/*
进队函数,从队尾进队,队头指针保持不变
*/
void en_queue(PQUEUE pS, BTNode e)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
printf("pNew malloc failed");
exit(-1);
}
else
{
pNew->data = e;
pNew->pNext = NULL;
pS->rear->pNext = pNew;
pS->rear = pNew;
}
return;
}
/*
出队函数,从队头出队,队尾指针保持不变,但当最后一个元素出队时。
须要对队尾指针又一次赋值。使其指向头结点
*/
bool de_queue(PQUEUE pS,BTNode *pData)
{
if(is_empty(pS))
return false;
else
{
PNODE p = pS->front->pNext;
*pData = p->data;
pS->front->pNext = p->pNext;
//这里是队列头元素出队的特殊情况,普通情况下。删除队头元素时
//仅需改动头结点中的指针,但当队列中最后一个元素被删除时,
//队列尾指针也丢失了。因此需对队尾指针又一次赋值(指向头结点)。
标签:pS,PQUEUE,offer,pNew,PNODE,二叉树,front,从上向下,指针 来源: https://www.cnblogs.com/ldxsuanfa/p/10833673.html