1. 程式人生 > 實用技巧 >[六省聯考2017]分手是祝願

[六省聯考2017]分手是祝願

大綱:

二叉樹上的寬度搜索

圖上的寬度搜索

  拓撲排序

棋盤上的寬度搜索

什麼時候使用寬度優先搜尋呢?

圖的遍歷

  層級遍歷

  由點及面

  拓撲排序

最短路徑

  僅限簡單圖求最短路徑:即圖中每條邊長度都是1,並且沒有方向。

如果題目問最短路徑,那麼除了BFS還可能是什麼演算法呢?如果是問最長路徑呢?

答:那麼就是動態規劃演算法。如果是最長路徑,那麼就可能是DFS和DP。

二叉樹上的寬度優先搜尋

圖的遍歷(層級遍歷)

注:樹是圖的一種特殊形態,樹屬於圖。

在這裡簡單介紹一下,BFS演算法結束的條件

class Solution{
    public:
        vector
<vector<int>> levelorder(TreeNode root){ vector<vector<iny>>* result = new vector<vector<int>>(); if(root == NULL) { return result; } //宣告一個佇列queue //因為佇列中不斷出隊和入隊的是樹的結點
//所以資料元素是TreeNode //和vector一樣,均採用模板類實現,所以在例項化的時候需要加入資料型別 queue<TreeNode>* queue = new queue<TreeNode>(); queue->push(root); //當最後一個結點結束後,佇列中所有元素被彈出 //此時queue為空 while(!queue->empty()) {
//用於存放本層的數值元素 vector<int>* level = new vector<int>(); int size = queue->size(); for(int i = 0; i < size; i++) { TreeNode head = queue->front(); queue->pop(); level->push_back(head.val); if(head.left != NULL) { queue->push_back(head.left); } if(head.right != NULL) { queue->push_back(head.right); } } result->push_back(level); //釋放前面生成的空間 delete[]; } return result; } }

上面程式碼中可能會出現錯誤,但是思路是這樣,需要微調

上面程式碼中聲明瞭兩個vector容器和一個queue佇列

vector容器的result是用來存放層級遍歷的最終結果,level是當層級遍歷到某一層時用來儲存該層的遍歷結果,待該層遍歷結束時,將此level新增到result中,形成最後的結果