1 /*
2 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印例如输出图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11。
3 struct BinaryTreeNode
4 {
5 int m_nValue;
6 BinaryTreeNode* m_pLeft;
7 BinaryTreeNode* m_pRight;
8 };
9 8
10 6 10
11 5 7 9 11
12 每一次打印一个结点的时候,如果该结点右子节点,则把该结点的子节点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被但因出来为止。
13 既然我们已经确定数据容器是一个队列了,现在的问题就是如何实现队列。实际上我们无须自己动手实现,因为STL已经为我们实现了一个很好的deque。
2 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印例如输出图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11。
3 struct BinaryTreeNode
4 {
5 int m_nValue;
6 BinaryTreeNode* m_pLeft;
7 BinaryTreeNode* m_pRight;
8 };
9 8
10 6 10
11 5 7 9 11
12 每一次打印一个结点的时候,如果该结点右子节点,则把该结点的子节点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被但因出来为止。
13 既然我们已经确定数据容器是一个队列了,现在的问题就是如何实现队列。实际上我们无须自己动手实现,因为STL已经为我们实现了一个很好的deque。
14 现在是用deque实现的代码:
15 void PrintFronTopBottom(BinaryTreeNode *pTreeRoot) //二叉树的层次遍历
16 {
17 if(!pTreeRoot) //根结点不为空
18 return;
19
20 std::deque<BinaryTreeNode*> dequeTreeNode;
21
22 dequeTreeNode.push_back(pTreeRoot);
23
24 while(dequeTreeNode.size())
25 {
26 BinaryTreeNode *pNode = dequeTreeNode.front(); //当前队列中的头结点
27 dequeTreeNode.pop_front(); //头删
28
29 printf("%d ",pNode->m_nValue); //打印出数据
30
31 if(pNode->m_pLeft) //左子树不为空,入队列
32 dequeTreeNode.push_back(pNode-<m_pLeft);
33
34 if(pNode->m_pRight)
35 dequeTreeNode.push_back(pNode->m_pRight); //右子女不为空,入队列
36 }
37 }