二叉樹除了前、中、後序三種遍歷方式外,有時候還要用到分層遍歷。分層遍歷就是二叉樹的廣度優先演算法,暫時還沒有見過圖的廣度優先演算法,據說廣度優先演算法都要使用乙個輔助佇列。
題目一:分層遍歷二叉樹,從上往下列印二叉樹的每乙個節點,同一層次的節點按照從左到右的順序列印。
下圖順序輸出1 2 3 4 5 6 7 8
//用queue更好
void
printbinaytree(binarytreenode* proot)
}
題目二:上面的程式雖然是分層列印了,但是列印的時候是直接順序輸出的。並不能在輸出中確定哪些數字屬於哪層。如何使得程式分層列印,從上至下每層輸出一行?
分析:可以用乙個陣列並用兩個標號來表示。
解法一:
[cpp]view plain
copy
void
printnodebylevel(binarytreenode*proot)
//每一次迴圈都將下一層的節點壓入vector,並且列印完本層節點
std::cout/cur==last時說明該層訪問結束
}
當樹的節點比較多的時候,上面運用vector儲存了所有的節點,所以空間複雜度是o(n),對空間消耗是比較大的。
解法二:運用兩個佇列來進行交換
[cpp]view plain
copy
void
printnodebylevel(binarytreenode* proot)
while
(!q1.empty());
cout <
//這裡需要運用daque而不是queue,因為deque才支援swap()操作。
//注意,swap()是o(1)的操作,實際上只是交換迭代器。
q1.swap(q2);
}while
(!q1.empty());
}
能不能僅用乙個佇列模擬問題一中的分層遍歷來實現列印?這樣關鍵的問題是如何換行。所以提供乙個標誌就可以了,可以運用乙個空指標來表示一行的結束。
解法三:
[cpp]view plain
copy
void
printnodebylevel(binarytreenode* proot)
//當發現空指標(結束訊號)時,要檢查佇列內是否還有節點,
//如果沒有的話還插入新的結束訊號,則會做成死迴圈
else
if(!q.empty())
} while
(!q.empty());
}
分層遍歷二叉樹
include include struct node struct node inittree for i 0 i 2 i tree 3 lchild tree 7 tree 5 rchild tree 8 return tree 0 int printnodeatlevel struct nod...
分層遍歷二叉樹
程式設計之美 3.10 p252 給定一棵二叉樹,壓球按分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹 每一層將單獨輸出一行 每一層要求訪問的順序為從左到右,並將節點依次編號。分層輸出二叉樹。struct nodevoid printnodebylevel node root 輸出為 1 2 34 ...
二叉樹的分層遍歷
二叉樹除了前 中 後序三種遍歷方式外,有時候還要用到分層遍歷。分層遍歷就是二叉樹的廣度優先演算法,暫時還沒有見過圖的廣度優先演算法,據說廣度優先演算法都要使用乙個輔助佇列。題目一 分層遍歷二叉樹,從上往下列印二叉樹的每乙個節點,同一層次的節點按照從左到右的順序列印。下圖順序輸出1 2 3 4 5 6...