經典演算法學習——層序遍歷二叉樹
阿新 • • 發佈:2019-02-12
我們可以用很多方式去遍歷一顆二叉樹,比如先序遍歷,中序遍歷,後序遍歷,其實都是通過遞迴的來實現。今天我們來對二叉樹進行層序遍歷,層序遍歷的時候需要藉助另一種資料結構——佇列。本篇的示例程式碼上傳至 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); }