剑指offer面试题23
思路:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的队尾。接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,知道队列为空。
代码如下:
二叉树的结构:
//二叉树定义
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode*m_pRight;
};
层序遍历函数:
/************************************************************************/
/* 从上往下打印二叉树 剑指offer,面试题23 */
/************************************************************************/
void printFromTopTpBottom(BinaryTreeNode*pNode){
if (pNode == NULL)//边界条件
{
return;
}
std::deque<BinaryTreeNode*> dequeTreeNode;//双端队列
dequeTreeNode.push_back(pNode);//从后面压入
while (dequeTreeNode.size())
{
BinaryTreeNode* pTemp = dequeTreeNode.front();//得到前面的一个
dequeTreeNode.pop_front(); //从前面弹出
cout << pTemp->m_nValue << " "; //打印值
if (pTemp->m_pLeft)//有左子树,就压入队列
{
dequeTreeNode.push_back(pTemp->m_pLeft);
}
if (pTemp->m_pRight)//有右子树,就压入队列
{
dequeTreeNode.push_back(pTemp->m_pRight);
}
}
}
以上代码需要特别注意STL中双端队列deque的用法,从后面压入是:push_back,从前面弹出是pop_front(),得到前面一个是front(),使用deque需要包括头文件#include<deque>