从上往下打印二叉树 | 层次遍历二叉树

面试题23:从上往下打印二叉树

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);
        }
    }
}