《編程之美》讀書筆記16: 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的數組下標訪問要比采用迭代器訪問慢很多,最好采用迭代器來訪問內部數據。
上面的代碼,保留了樹的所有全部節點,稍做修改(比如用一個數組記錄每層的最后一個節點的位置),可以查詢某層的所有節點。如果不需要保存中間結果,可以修改為:
當然也可以用queue(queue只是對deque的封裝)。
對問題2,上面的代碼只要做稍微修改,只在遍歷到所要求的層才輸出,輸出后直接返回就可以了。
Powered by: C++博客 Copyright © flyinghearts