《編程之美》讀書筆記16: 3.10 分層遍歷二叉樹
看到Milo寫的這篇文章,又翻了下書,發(fā)現(xiàn)書的代碼(P253)有個瑕疵,每個節(jié)點值后面都會顯示一個空格,如果將間隔字符改為“-”,輸出的每行最后都有一個“-”,不能達到要求。不過,只要將 cout << vec[cur] -> data << " ";
這行改為:
if (cur==last-1) cout << vec[cur] -> data << "\n";
else cout << vec[cur] -> data << " ";
即可修正這個問題。
書上的代碼用了兩個while循環(huán),可以精簡為一個。
思路:保存每層的最后一個節(jié)點位置(取節(jié)點的地址或在容器內(nèi)的位置),當遍歷到該位置時,獲取下一層最后一個節(jié)點的位置,如果這兩個位置相同,說明已經(jīng)遍歷完全部節(jié)點,否則開始下一層的遍歷。
由于不知道樹的節(jié)點數(shù),很多情況下,容器采用deque比采用vector性能更佳,因為避免了申請內(nèi)存后對原數(shù)據(jù)的拷貝。另外,再考慮到deque的數(shù)組下標訪問要比采用迭代器訪問慢很多,最好采用迭代器來訪問內(nèi)部數(shù)據(jù)。
上面的代碼,保留了樹的所有全部節(jié)點,稍做修改(比如用一個數(shù)組記錄每層的最后一個節(jié)點的位置),可以查詢某層的所有節(jié)點。如果不需要保存中間結(jié)果,可以修改為:
當然也可以用queue(queue只是對deque的封裝)。
對問題2,上面的代碼只要做稍微修改,只在遍歷到所要求的層才輸出,輸出后直接返回就可以了。
Powered by: C++博客 Copyright © flyinghearts