所谓的层序遍历,就是按照从上到下,从左到右的顺序遍历该二叉树。所以按层打印的顺序就应该先打印根节点,然后依次为根节点的左孩子,右孩子。根节点的左孩子的左孩子,根节点的左孩子的右孩子……假设有如图所示的二叉树。
由图可知,先打印根节点8,在打印节点8的时候,有必要先把节点6和10两个节点保存在一个容器中。按照从左到右遍历的顺序,我们应先取出节点6,打印6之后应该把它的左右节点5和7依次放入容器中。此时容器中有三个节点10,5,7。接下来取出节点10,因为节点10比节点5和7早放入容器,此时又比这两个节点早取出,所以该容器应该符合先进先出的特性,即为一个队列(使用deque(双端队列),两个都可以进出数据)。由于节点5,7,9,11没有子节点,故只需要依次出队列打印即可。
#include <iostream>
#include <deque>
using namespace std;
typedef struct BinaryTreeNode
{
int _data;
BinaryTreeNode* _left;
BinaryTreeNode* _right;
}Node;
void PrintfFromTopToBottom(Node* root)
{
if (root == NULL)
{
return ;
}
deque<Node *> DequeTreeNode;
DequeTreeNode.push_back(root);
while (DequeTreeNode.size() != NULL)
{
Node *pNode = DequeTreeNode.front();
DequeTreeNode.pop_front();
printf("%d ",pNode->_data);
if (pNode->_left != NULL)
{
DequeTreeNode.push_back(pNode->_left);
}
if (pNode->_right)
{
DequeTreeNode.push_back(pNode->_right);
}
}
}