二叉樹的列印是根據遍歷方法來的,有前序遍歷、中序遍歷、後續遍歷以及層序遍歷。前三種估計很熟悉了,那麼這個講講層序遍歷。
在學過圖後,我們知道了廣度優先搜尋,這裡就是同乙個思想,使用佇列結構。
下面給出兩種解題思想:
a 將頭節點賦值給last
b 彈出乙個節點,進行列印
c 對該彈出節點進行判斷是否為last節點,是的話就換行
d 彈出的每乙個節點時,如其有子節點,放入佇列中且進行nlast = (該節點子節點)的賦值操作,直到彈出的節點是last節點結束(包括last節點子節點也要進行前面操作)
e 把nlast節點賦值給last節點,進行下一輪節點列印直到queue為空結束
第二種解題思路,可以定義兩個變數,乙個變數k來記錄當前行節點的個數,乙個m記錄下一行節點的個數,那麼也能實現相同的效果。
所謂序列化是指將二叉樹轉換為字串的過程。反序列化就是指將字串轉化為二叉樹的過程。二叉樹被記錄成檔案的過程叫做二叉樹的序列化,通過檔案內容重建原來的二叉樹的過程叫做二叉樹的反序列化。序列化的方式同樣有四種,和遍歷方式相同。
給定一顆二叉樹的頭節點head,並已知二叉樹節點值的型別為32為整數,設計一種二叉樹序列化和反序列化方案。
序列化實現方案(先序遍歷序列化):
1 假設序列化的結果為str,初始時為空字串
2 先序遍歷二叉樹時,如果遇到空節點,就在str末尾加上「#!」(這裡為什麼要加!呢?因為呀若不加,在不知道節點值為多少位的情況下,就容易出現歧義,比如若相鄰兩節點為1,23,那麼顯示地為123,而節點為12,3顯示的結果同樣為123,所以到底是哪個呢?這就出現歧義了)
3 如果遇到不為空的節點, 假設節點值為3, 就在str的末尾加上「3!」
反序列化這裡注意兩點:
1 選擇用什麼樣的遍歷方式序列化,就選擇用什麼樣的方式反序列化
2 一棵樹序列化的結果是唯一的,唯一的結果生成的二叉樹也是唯一的(那麼為什麼?這裡不妨大家去敲下**,或自己在草稿紙上比劃幾個小例子,我想就會很快得出答案了,這裡應該是空節點也是用「#!」列印出來的關係,記住就行了)
演算法與資料結構 二叉樹
二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...
資料結構與演算法 二叉樹
1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...
資料結構與演算法 二叉樹
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...