二叉樹列印

2021-10-02 07:22:32 字數 2007 閱讀 7505

給定一顆二叉樹的頭節點head,請按照現在大家看到的這種格式列印

要求列印成:12

主要解決的問題是:如何換行

last:表示正在列印的當前行的最右節點

從左至右遍歷,如果遍歷到last節點,說明該換行了,

換行之後,只需要nlast=last,繼續下一行的列印過程,一直重複,直到所有的節點都列印完。

nlast和last的關係?

讓nlast一直跟蹤記錄寬度優先佇列中最新加入的節點即可,因為最新加入的節點一定是目前發現的下一行的

最右節點,所以列印完當前節點,nlast一定是當前發現的下一行的最右節點

eg:如下圖

開始時,last=

1,把節點1放入queue,從queue中彈出節點1,並列印,如圖1

接著放節點1的孩子,令nlast=

2,放節點3時,令nlast=

3此時發現彈出的節點1和last相等,即:nlast=last,該換行了,如圖2

從queue中再彈出節點2,並列印,再將節點2的孩子,節點4放入queue,同

時令nlast=

4,從queue中彈出節點3,並列印,然後將節點3的孩子放入queue中,

放入節點5時,nlast更新成節點5,放入6,nlast更新成節點6,此時,

發現彈出的節點3是last的節點,所以換行,如圖3

eg:使用先序遍歷對二叉樹進行序列化

(1)假設序列化結果為str,初始化str為空字串

(2)先序遍歷二叉樹時,如果遇到空節點目,就在str末尾加上」#!「

(3)如果遇到不為空的節點,假設節點值為3,就在str的末尾加上」3!「

注意:#表示為空節點,!表示乙個值結束,也可以用別的字元表示

str的最終結果是:

str=

12!2!#!#!#!

為啥要用特殊字元表示結束?

如果不用特殊符號表示值的結束,則這兩棵樹的序列化結果為123

###,說明不用特殊字元表示節點值結束的話,

會有歧義,如下圖所示

(1)把結果str首先變成字串型別的陣列values,該陣列代表二叉樹

str=

"12!3#!#!#!"||

↓values=

["12"

,"3"

,"#"

,"#"

,"#"

](2)再按照先序遍歷的方法,建立二叉樹,結果如下

遇到"12",是根節點,接著建立左子樹

接著遇到字串"3",生成節點值為3的節點,他是節點12的左孩子,再建立節點3的左子樹

遇到"#",生成空節點,就沒有後序建立子樹的過程了,他是節點3的左孩子

再遇到」#「,就將成為節點3的右孩子,因為他為空。。。

(1)選擇用什麼樣的遍歷方式序列化,就選擇用什麼樣的方式反序列化

(2)一棵樹序列化的結果是唯一的,唯一的結果生成的二叉樹也是唯一的

(1)用佇列來進行二叉樹的按層遍歷,即:寬度優先搜尋

(2)除了訪問節點的順序是按層遍歷之外,對結果字串的處理,與之前介紹的處理方式一樣

(3)反序列化過程同理

二叉樹列印

舉例 1.初始化時,last 1,把1放入佇列 2.將1出隊,把1的子孩子2,3放入佇列,更新nlast 3 3.nlast更新完之後,列印上一次出隊的1,並和last比較,如果相同就列印換行,並更新last nlast 3 4.將2出隊,把2的子孩子4放入佇列,更新nlast 4 5,nlast更...

列印二叉樹

之前在了解二叉樹旋轉的時候,為了方便檢視中間狀態,就寫了個以樹狀形式列印二叉樹的函式。起初是使用二叉樹中序遍歷的結果展開的方式,簡單但列印出來的樹有一定的傾斜。例如這棵樹 5 3 7 2 6 8它的中序遍歷結果為 2 3 5 6 7 8 列印出來的結果中,節點 3 和節點 7 不是對稱的。因為節點 ...

二叉樹問題 二叉樹層級列印

給定二叉樹的頭結點,按層級列印二叉樹節點值。從上到下按層遍歷,應該是先遍歷到的節點先輸出。因此用佇列作為輔助結構來解此題。層級遍歷中關鍵點要知道什麼時候換層。用兩個變數last 和nlast,分別指向當前層的最右邊和下一層的最右邊節點。當當前層的最右邊節點從佇列中輸出時,表示這一層遍歷完畢了,此時使...