《劍指Offer》二叉樹列印問題的歸納總結

2021-10-06 10:47:01 字數 1290 閱讀 1543

引言

按照以上順序逐個深入分析,語言:c++。

22、從上往下列印二叉樹

題目描述:從上往下列印出二叉樹的每個節點,同層節點從左至右列印。

思路:利用佇列「先入先出」性質,列印某個結點的時候,若該結點有子結點,則把該結點的子結點放到乙個佇列的末尾,到佇列的頭部取出最早進入佇列的結點,重複前面的操作,直至佇列中所有的結點都列印完成。

vector<

int>

printfromtoptobottom

(treenode* root)

return res;

}

60、把二叉樹列印成多行

題目描述:從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

思路:60是22題的變形,要求列印成多行。首先,對應 vector列印所有層節點的值,還需要一臨時變數 vector來存放每層的節點值。其次,還需考慮每層列印多少個節點值呢?所以還需要乙個變數num來記錄每一層的節點個數。

vectorint>

>

print

(treenode* root)

res.

push_back

(tmp)

;//將每一層列印值push_back進res

}return res;

}

59、按之字順序列印二叉樹

題目描述:按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二行按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

思路:59又是在60題基礎上的變形,和上面一樣的思路,只需要解決乙個問題:如何實現偶數行從右至左的順序列印?只有偶數行才需要逆序列印,設定一bool變數order控制是否需要逆序列印,用內建reverse函式實現逆序。

vectorint>

>

print

(treenode* root)

if(order)

//偶數行逆序列印

reverse

(tmp.

begin()

,tmp.

end())

; res.

push_back

(tmp)

; order=

!order;

}return res;

}

本題採用佇列和內建reverse函式,該思路的複雜度較高,這裡只是為了承接上面兩題的方法歸納,大家可以去嘗試各種方法,如棧的實現等。

劍指offer 從上往下列印二叉樹

定義乙個佇列,依次加入佇列頭的子節點,並將佇列頭出佇列,知道隊列為空 coding utf 8 class treenode def init self,x self.val x self.left none self.right none class solution 返回從上到下每個節點值列表,...

劍指offer 之字形列印二叉樹

請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。利用兩個棧 定義乙個兩個棧的陣列 用current和next分別指示當前層和下一層,如果當前層是奇數層 current 0 則下一層先入棧左節點再入棧右節點...

劍指offer 從上往下列印二叉樹

題目描述 從上往下列印出二叉樹的每個節點,同層節點從左至右列印。其實就是二叉樹的層序遍歷 遍歷結果 a b c d e f g h 先存進去的節點先列印,這樣的特性不就和佇列fifo的特性相同了嗎?處理的方法就是將二叉樹的節點從上到下,從左到右的存入佇列中,然後逐個列印。struct treenod...