二叉樹的分層遍歷

2021-06-14 20:32:25 字數 1230 閱讀 4536

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

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

下圖順序輸出1 2 3 4 5 6 7 8

//用queue更好

void printbinaytree(binarytreenode* proot)

}

題目二:上面的程式雖然是分層列印了,但是列印的時候是直接順序輸出的。並不能在輸出中確定哪些數字屬於哪層。如何使得程式分層列印,從上至下每層輸出一行?

分析:可以用乙個陣列並用兩個標號來表示。

解法一:

void printnodebylevel(binarytreenode*proot)

//每一次迴圈都將下一層的節點壓入vector,並且列印完本層節點

std::cout<

當樹的節點比較多的時候,上面運用vector儲存了所有的節點,所以空間複雜度是o(n),對空間消耗是比較大的。

解法二:運用兩個佇列來進行交換

void printnodebylevel(binarytreenode* proot)

while (!q1.empty());

cout << endl;

//這裡需要運用daque而不是queue,因為deque才支援swap()操作。

//注意,swap()是o(1)的操作,實際上只是交換迭代器。

q1.swap(q2);

}while(!q1.empty());

}

能不能僅用乙個佇列模擬問題一中的分層遍歷來實現列印?這樣關鍵的問題是如何換行。所以提供乙個標誌就可以了,可以運用乙個空指標來表示一行的結束。

解法三:

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...