劍指Offer 62 序列化二叉樹

2021-10-04 00:19:48 字數 2600 閱讀 2794

題目描述

請實現兩個函式,分別用來序列化和反序列化二叉樹

二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。

二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。

題解:遞迴

1

public

static

string serialize(treenode root)

6 string res = root.val + "_";

7 res+=serialize(root.left);

8 res +=serialize(root.right);

9return

res;10}

11/**

12* 將序列化字串裝入乙個queue中

13*/

14public

static

treenode deserialize(string str)

19/**

20* 前序遍歷反序列化

21* 從佇列中取出乙個判斷是否是"#",如果是表示該結點為null,否則新建結點

22*/

23public

static treenode deserialize(queuequeue)

28 treenode root = new

treenode(integer.parseint(string));

29 root.left =deserialize(queue);

30 root.right =deserialize(queue);

31return

root;

32 }

初始化樹:

1

public

static

class

treenode8}

9private

static listnodelist = null;10

public

static treenode createbintree(int

array)

16//

對前lastparentindex-1個父節點按照父節點與孩子節點的數字關係建立二叉樹

17for (int parentindex = 0; parentindex < array.length / 2 - 1; parentindex++)

25//

最後乙個父節點:因為最後乙個父節點可能沒有右孩子,所以單獨拿出來處理

26int lastparentindex = array.length / 2 - 1;

27//

左孩子28 nodelist.get(lastparentindex).left =nodelist

29 .get(lastparentindex * 2 + 1);

30//

右孩子,如果陣列的長度為奇數才建立右孩子

31if (array.length % 2 == 1)

35return nodelist.get(0);

36 }

層序遍歷列印:

1

public

static arraylist>print(treenode proot)

7queue.offer(proot);

8while (queue.size()!=0)

16list.add(node.val);

17queue.offer(node.left);

18queue.offer(node.right);19}

20if(list.size()!=0)23}

24return

res;

25 }

測試:

1

public

static

void

main(string args) ;

3 treenode root =createbintree(tree);

4 string serialize =serialize(root);

5system.out.println(serialize);

6 treenode deserialize =deserialize(serialize);

7 arraylist> lists =print(deserialize);

8for (arraylistlist : lists) 11}

12輸出:

138_6_5_#_#_7_#_#_10_9_#_#_11_#_#_

14 [8]

15 [6, 10]

16 [5, 7, 9, 11]

《劍指offer》 62 序列化二叉樹

題目 請實現兩個函式,分別來序列化和反序列化二叉樹。方案分析 我們知道通過二叉樹的中序和任何乙個前或者後續遍歷都可以反序列化一棵二叉樹,但是這樣做有乙個缺點就是,序列化的資料不能有重複的資料,否則會出錯。另外,在反序列化時,需要知道中序和另外的任意一種序列才行,如果兩課二叉樹在字元流裡讀出,且二叉樹...

62 序列化二叉樹

題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹.二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...

劍指Offer 37 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 例 樹 1 2 3 4 5 6 序列化 1,2,4,3,5,6,容易發現序列化其實就是帶none的前序遍歷。所以題目就是完成乙個前序遍歷將節點值存入列表,遍歷列表按前序生成一棵二叉樹。時間複雜度 o n 空間複雜度 o n from datstru i...