1.题目描述:面试
从上往下打印出二叉树的每一个结点,同一层的结点按照从左到右的顺序打印。例如输入下图中的二叉树,则依次打印出八、六、十、五、七、九、11。spa
叉树结点的定义以下:code
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; };
2.题目分析blog
由于按层打印的顺序决定应该先打印根结点,因此咱们从树的根结点开始分析。为了接下来可以打印值为8的结点的两个子结点,咱们应该在遍历到该结点时把值为6和10的两个结点保存到一个容器里,如今容器内就有两个结点了。按照从左到右打印的要求,咱们先取出值为6的结点。打印出值6以后把它的值分别为5和7的两个结点放入数据容器。此时数据容器中有三个结点,值分别为十、5和7。接下来咱们从数据容器中取出值为10的结点。注意到值为10的结点比值为五、7的结点先放入容器,此时又比这两个结点先取出,这就是咱们一般说的先入先出,所以不难看出这个数据容器应该是一个队列。因为值为五、七、九、11的结点都没有子结点,所以只要依次打印便可。整个打印过程以下表所示。队列
经过上面具体例子的分析,咱们能够找到从上到下打印二叉树的规律:每一次打印一个结点的时候,若是该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最先进入队列的结点,重复前面的打印操做,直至队列中全部的结点都被打印出来为止。class
3.code容器
void PrintFromTopToBottom(BinaryTreeNode* pTreeRoot) { if(!pTreeRoot)//if(pTreeRoot == NULL) { return ; } std::deque<BinaryTreeNode*> dequeTreeNode; dequeTreeNode.push_back(pTreeRoot); while(!dequeTreeNode.empty()) { BinaryTreeNode* pNode = dequeTreeNode.front(); dequeTreeNode.pop_front(); std::cout<<pNode->m_nValue<<" "; if(pNode->m_pLeft) { dequeTreeNode.push_back(pNode->m_pLeft); } if(pNode->m_pRight) { dequeTreeNode.push_back(pNode->m_pRight); } } }