二叉樹的分層遍歷

2021-06-19 09:11:46 字數 1517 閱讀 3812

二叉樹除了前、中、後序三種遍歷方式外,有時候還要用到分層遍歷。分層遍歷就是二叉樹的廣度優先演算法,暫時還沒有見過圖的廣度優先演算法,據說廣度優先演算法都要使用乙個輔助佇列。

題目一:分層遍歷二叉樹,從上往下列印二叉樹的每乙個節點,同一層次的節點按照從左到右的順序列印。

下圖順序輸出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...