從上往下打印二叉樹 | 層次遍歷二叉樹

面試題23:從上往下打印二叉樹

1.題目描述:

從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序打印。例如輸入下圖中的二叉樹,則依次打印出8、6、10、5、7、9、11。

叉樹結點的定義如下:

struct BinaryTreeNode
{
    int m_nValue;
    BinaryTreeNode* m_pLeft;
    BinaryTreeNode* m_pRight;
};

2.題目分析

因爲按層打印的順序決定應該先打印根結點,所以我們從樹的根結點開始分析。爲了接下來能夠打印值爲8的結點的兩個子結點,我們應該在遍歷到該結點時把值爲6和10的兩個結點保存到一個容器裏,現在容器內就有兩個結點了。按照從左到右打印的要求,我們先取出值爲6的結點。打印出值6之後把它的值分別爲5和7的兩個結點放入數據容器。此時數據容器中有三個結點,值分別爲10、5和7。接下來我們從數據容器中取出值爲10的結點。注意到值爲10的結點比值爲5、7的結點先放入容器,此時又比這兩個結點先取出,這就是我們通常說的先入先出,因此不難看出這個數據容器應該是一個隊列。由於值爲5、7、9、11的結點都沒有子結點,因此只要依次打印即可。整個打印過程如下表所示。

通過上面具體例子的分析,我們可以找到從上到下打印二叉樹的規律:每一次打印一個結點的時候,如果該結點有子結點,則把該結點的子結點放到一個隊列的末尾。接下來到隊列的頭部取出最早進入隊列的結點,重複前面的打印操作,直至隊列中所有的結點都被打印出來爲止。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章