前幾天,宿舍乙個mm問我,二叉樹的層次遍歷演算法是如何實現的。於是,正在洗腳的我開動疲勞了一整天的腦筋,開始思考這個問題。
因為之前看演算法的時候,樹就看的不多,而且即使是關於二叉樹的,主要也都是因為遞迴的原因,主要思考的是前序、中序和後序遍歷。甚至於,在前面的文章中,也**了「
已知前序遍歷和中序遍歷,求後序遍歷
」這樣的演算法。所以,當時一時之間,我的大腦似乎有些混沌,一心想著,樹的遍歷不就是遞迴嘛,區別就是何時遞迴,何時列印數值而已。於是,我脫口而出了n多的、不同的遞迴演算法。不過,最後一一被同住的mm們嗤之以鼻。當時那叫乙個丟臉,乙個尷尬呀。。。
當然,知恥而後勇,才是正確的解決方式。於是,閒來無事,再次開動大腦的馬達,把這個問題解決了!最近,在我頹廢的「寄生蟲生活」中,用於學習的時間實在是少之又少,所以花費在stl上的時間算是作為正常的「人類」的大多數時間了。因此,有一種衝動想要用stl來模擬算中中的資料結構,可惜最後因為實在不知道怎麼完美的實現二叉樹的結構而因此作罷。但是
完整的**又太麻煩,我就不寫全了,但是基本的演算法應該是沒錯的。資料結構就隨便定義一下吧,反正基本上都是一樣的。
總的來說,是用乙個佇列來存放遍歷過的二叉樹節點的左右子樹,作為乙個快取區吧。具體的**如下:
//二叉樹的資料結構
struct
binarytree
binarytree
*root;
//已知二叉樹的根節點
void
level(
const
binarytree
* root )
...
if( p
->
right
!=null )
//若右子樹不空,則令其入隊
buf.pop();
//遍歷過的節點出隊
cout
<<
endl;
}
層次遍歷二叉樹
問題 假定根節點位於第0層 1.層次遍歷二叉樹 每層換行分開 2.層次遍歷二叉樹指定的某層 本文 例如 上圖中1.123 4567 82.第三層 78可以看出得出第二問的解,第一問迎刃而解了,所以從問題二下手 1.層次遍歷二叉樹指定的某層 可以得出這樣的乙個結論 遍歷二叉樹的第k層,相當於遍歷二叉樹...
二叉樹層次遍歷
題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。思路 二叉樹的層次遍歷,利用棧的先進後出的特性。struct treenode class solution res.push back temp while m.empty m中是從左往右入棧,這裡把它反過來,s中是從右往左...
二叉樹層次遍歷
層次遍歷二叉樹,每一次儲存在list中,結果按從葉子層到根,從左到右的順序儲存 一 class solution return lists 相當於在先序的基礎上改進,level是每個node所在的層次。如果lists大小和level相等,說明開始新一層的儲存。如果不等,則直接把值存入相應層次的lis...