思路:二叉树的层次遍历思路,借助队列来实现。相当于广度优先搜索,使用队列(深度优先搜索的话,使用栈)。
若根节点为空,直接返回;
若根节点非空,则将根节点入队,然后,判断队列是否为空,若不为空,则将队首节点出队,访问,
并判断其左右子节点是否为空,若不为空,则压入队列。
步骤:
1.申请一个辅助队列,并且先把根节点入队
2.判断队列是否为空
3.队列不为空则进入循环,循环条件就是队列是否为空
4.循环内:弹出队列的结点,并且打印结点中的内容,如果结点的左子树或右子树不为空,则入队
代码:
typedef struct node
{
int nValue;
struct node *pLeft;
struct node *pRight;
}BinaryTree;
typedef struct node3
{
BinaryTree* nValue;
struct node3 *pNext;
}MyQueue;
typedef struct node4
{
int nCount;
MyQueue *pHead;
MyQueue *pTail;
}Queue;
void q_Init(Queue **pQueue)
{
*pQueue = (Queue*)malloc(sizeof(Queue));
(*pQueue)->pHead = NULL;
(*pQueue)->pTail = NULL;
(*pQueue)->nCount = 0;
}
void q_Push(Queue *pQueue,BinaryTree* nNum)
{
if(pQueue == NULL)return;
MyQueue *pTemp = NULL;
pTemp = (MyQueue*)malloc(sizeof(MyQueue));
pTemp->nValue = nNum;
pTemp->pNext = NULL;
if(pQueue->pHead == NULL)
{
pQueue->pHead = pTemp;
}
else
{
pQueue->pTail->pNext = pTemp;
}
pQueue->pTail = pTemp;
pQueue->nCount++;
}
BinaryTree* q_Pop(Queue *pQueue)
{
if(pQueue == NULL || pQueue->nCount == 0)return NULL;
MyQueue *pDel = NULL;
BinaryTree* nNum = NULL;
pDel = pQueue->pHead;
nNum = pDel->nValue;
pQueue->pHead = pQueue->pHead->pNext;
free(pDel);
pDel = NULL;
pQueue->nCount--;
if(pQueue->nCount == 0)
{
pQueue->pTail = NULL;
}
return nNum;
}
int q_IsEmpty(Queue *pQueue)
{
if(pQueue == NULL)return -1;
return pQueue->nCount ? 0:1;
}
//层次遍历函数
void LevelTraversal(BinaryTree *pTree)
{
if(pTree == NULL)return;
//申请辅助队列
Queue *pQueue = NULL;
q_Init(&pQueue);
//根入队
q_Push(pQueue,pTree);
while(!q_IsEmpty(pQueue))
{
//弹出
pTree = q_Pop(pQueue);
//打印
printf("%d ",pTree->nValue);
//非空左右入队
if(pTree->pLeft != NULL)
{
q_Push(pQueue,pTree->pLeft);
}
if(pTree->pRight != NULL)
{
q_Push(pQueue,pTree->pRight);
}
}
}