3.10
分層遍歷二叉樹
看到milo寫的這篇文章
,又翻了下書,發現書的**(p253)有個瑕疵,每個節點值後面都會顯示乙個空格,如果將間隔字元改為「-」,輸出的每行最後都有乙個「-」,不能達到要求。不過,只要將 cout << vec[cur] -> data << " ";
這行改為:
if (cur==last-1) cout << vec[cur] -> data << "/n";
else cout << vec[cur] -> data << " ";
即可修正這個問題。
書上的**用了兩個while迴圈,可以精簡為乙個。
思路:儲存每層的最後乙個節點位置(取節點的位址或在容器內的位置),當遍歷到該位置時,獲取下一層最後乙個節點的位置,如果這兩個位置相同,說明已經遍歷完全部節點,否則開始下一層的遍歷。
由於不知道樹的節點數,很多情況下,容器採用deque比採用vector效能更佳,因為避免了申請記憶體後對原資料的拷貝。
另外,再考慮到deque的陣列下標訪問要比採用迭代器訪問慢很多
,最好採用迭代器來訪問內部資料。
view plain
copy to clipboard
print?
struct
node ;
void
print_tree_bfs_d(node* root) else
node=*++low;
} cout<< "/n"
; }
上面的**,保留了樹的所有全部節點,稍做修改(比如用乙個陣列記錄每層的最後乙個節點的位置),可以查詢某層的所有節點。如果不需要儲存中間結果,可以修改為:
view plain
copy to clipboard
print?
void
print_tree_bfs_dq(node* root) else
} cout<< "/n"
; }
當然也可以用queue(queue只是對deque的封裝)。
對問題2,上面的**只要做稍微修改,只在遍歷到所要求的層才輸出,輸出後直接返回就可以了。
完整程式(含測試例子)
程式設計之美 3 10 分層遍歷二叉樹
1 2 3 4 5 6 7 8 運用bfs只能輸出1,2,3,4,5,6,7,8這個序列,並不知道分層資訊,因此如何分層列印呢?我的方法就是對每乙個節點做以下判斷,如果該節點在佇列中的下乙個節點是是null說明該節點是樹在某一層的最後乙個節點,將該節點的子節點輸入佇列中之後,在輸入乙個null節點。...
程式設計之美 3 10 分層遍歷二叉樹
看到這本書就有一種高大上的感覺,隨手翻翻,今天又搞一道!首先,看到問題1我首先想到了圖的廣度優先搜尋遍歷演算法,後來一查書 資料結構高分筆記 才想起來樹本來就有一種遍歷方式叫 層次遍歷 p110 也就問題1中想要列印樹的方式。利用了資料結構 迴圈佇列 作為輔助的工具。其實自己想的時候也想到了用佇列的...
《程式設計之美》讀書筆記
程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...