思路:
借助队列完成
- 先将二叉树根节点入列,
- 取队顶打印
- 如果该节点有左孩子就入队左孩子;如果有右孩子就入队右孩子
- 队顶出队(如果队列为空,则跳出;如果队列不会空,则返回步骤2直至队列为空)
图解层序遍历
代码如下:
//二叉树层序遍历:二叉树层层压栈,层层递归跳出(先入先出)
void BinaryTreeLevelOrder(BTNode* root)
{
Queue qu;
BTNode * cur;
QueueInit(&qu);
QueuePush(&qu, root);
//队列是空返回1;非空返回0
while (!QueueIsEmpty(&qu))
{
cur = QueueTop(&qu);
putchar(cur->data);
if (cur->lChild)
{
QueuePush(&qu, cur->lChild);
}
if (cur->rChild)
{
QueuePush(&qu, cur->rChild);
}
QueuePop(&qu);
}
QueueDestory(&qu);
}
队列函数如下:
typedef char BTDataType;
// 二叉链节点的结构体
typedef struct BinaryTreeNode {
BTDataType data; // 当前节点值域
struct BinTreeNode* lChild; // 指向当前节点左孩子
struct BinTreeNode* rChild;// 指向当前节点右孩子
}BTNode;
typedef BTNode* QuDataType;
// 队列节点的结构体
typedef struct QueueNode
{
QuDataType _data;
struct QueueNode* _next;
}QueueNode;
//队列的结构体
typedef struct Queue {
QueueNode * _head;
QueueNode * _rear;
}Queue;
//队列初始化
void QueueInit(Queue* plist)
{
assert(plist);
plist->_head = NULL;
plist->_rear = NULL;
}
//队列销毁
void QueueDestory(Queue* plist)
{
QueueNode * tmp;
while (plist->_head)
{
tmp = plist->_head;
plist->_head = plist->_head->_next;
free(tmp);
}
}
//队列删除(头删)
void QueuePop(Queue* plist)
{
assert(plist);
QueueNode * tmp;
if (plist->_head)
{
tmp = plist->_head;
plist->_head = plist->_head->_next;
free(tmp);
}
}
//队列插入(尾插)
void QueuePush(Queue* plist, QuDataType x)
{
QueueNode * cur = (QueueNode *)malloc(sizeof(QueueNode));
cur->_data = x;
cur->_next = NULL;
if (QueueIsEmpty(plist))
{
plist->_head = plist->_rear = cur;
return;
}
plist->_rear->_next = cur;
plist->_rear = cur;
}
//队列如果是空,返回1;非空,返回0。
int QueueIsEmpty(Queue* plist)
{
return plist->_head == NULL;
}
//返回队头
QuDataType QueueTop(Queue* plist)
{
if (QueueIsEmpty(plist))
{
return (QuDataType)0;
}
return plist->_head->_data;
}