我们可以用很多方式去遍历一颗二叉树,比如先序遍历,中序遍历,后序遍历,其实都是通过递归的来实现。今天我们来对二叉树进行层序遍历,层序遍历的时候需要借助另一种数据结构——队列。本篇的示例代码上传至 https://github.com/chenyufeng1991/LevelOrderBinaryTree 。
层序遍历的基本思路是,当访问到一个节点的时候,把它放入队列,然后访问该值,同时把该节点的左右孩子节点放入队列,出队列该节点。其中需要注意的是,如果某个节点已经是叶子节点了,则不需要把它的左右孩子节点(虽然它没有左右孩子)放入队列。因为把一个空的节点push进队列会造成bug。同样的,如果它只有左孩子或者只有右孩子,也是同样的处理。递归结束的条件是当队列为空时结束。
核心代码如下:
//层序遍历
void LevelOrder(queue<Node *> &nodeQueue)
{
if (nodeQueue.empty())
{
return;
}
Node *frontNode = nodeQueue.front();
cout << frontNode->element << " ";
nodeQueue.pop();
if (frontNode->lChild != NULL)
{
nodeQueue.push(frontNode->lChild);
}
if (frontNode->rChild != NULL)
{
nodeQueue.push(frontNode->rChild);
}
LevelOrder(nodeQueue);
}