1. 程式人生 > >經典演算法學習——層序遍歷二叉樹

經典演算法學習——層序遍歷二叉樹

       我們可以用很多方式去遍歷一顆二叉樹,比如先序遍歷,中序遍歷,後序遍歷,其實都是通過遞迴的來實現。今天我們來對二叉樹進行層序遍歷,層序遍歷的時候需要藉助另一種資料結構——佇列。本篇的示例程式碼上傳至 https://github.com/chenyufeng1991/LevelOrderBinaryTree 。

       層序遍歷的基本思路是,當訪問到一個節點的時候,把它放入佇列,然後訪問該值,同時把該節點的左右孩子節點放入佇列,出佇列該節點。其中需要注意的是,如果某個節點已經是葉子節點了,則不需要把它的左右孩子節點(雖然它沒有左右孩子)放入佇列。因為把一個空的節點push進佇列會造成bug。同樣的,如果它只有左孩子或者只有右孩子,也是同樣的處理。遞迴結束的條件是當佇列為空時結束。

核心程式碼如下:

//層序遍歷
void LevelOrder(queue<Node *> &nodeQueue)
{
    if (nodeQueue.empty())
    {
        return;
    }

    Node *frontNode = nodeQueue.front();
    cout << frontNode->element << " ";
    nodeQueue.pop();
    if (frontNode->lChild != NULL)
    {
        nodeQueue.push(frontNode->lChild);
    }
    if (frontNode->rChild != NULL)
    {
        nodeQueue.push(frontNode->rChild);
    }

    LevelOrder(nodeQueue);
}