演算法 序列化二叉樹

2021-10-07 01:55:59 字數 1546 閱讀 4551

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

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

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

例如,我們可以把乙個只有根節點為1的二叉樹序列化為"1,",然後通過自己的函式來解析回這個二叉樹

這道題考驗的是二叉樹的遍歷!參考了別人的解法,有使用層次遍歷解法也有前序遍歷解法。

但是我了下邏輯都挺麻煩,便想找個相對邏輯簡單的解法。

我想到了 「二叉堆」,二叉堆是二叉樹的陣列形式。

序列化 -> 思路就是將二叉樹通過 堆 這乙個中介 轉換為字串。

反序列化 -> 將字串轉換為堆,然後將堆轉換為二叉樹。

雖然看似中間多了一層轉換,感覺麻煩了些,但是看下**就知道,其實是比其他解法簡單了。因為我這裡也算是將複雜問題進行拆解,別人都是一步到位,但是這一步太麻煩,而我是分兩步走,然而兩步都非常簡單,你選哪個?

// 序列化

static string serialize

(treenode root)

else

}return builder.

tostring()

;}// 遞迴將二叉樹對應到陣列堆

private

static

void

serrecursive

(object[

] array, integer nodeidx, treenode node)

array[nodeidx -1]

= node.val;

serrecursive

(array, nodeidx *

2, node.left)

;serrecursive

(array, nodeidx *2+

1, node.right);}

// 反序列化

static treenode deserialize

(string str)

treenode root =

newtreenode

(integer.

parseint

(r0));

desrecursive

(list,

1, root)

;return root;

}// 遞迴將陣列堆還原成二叉樹

private

static

void

desrecursive

(list

list, integer nodeidx, treenode node)if(

(r -1)

< size &&

!"#"

.equals

(list.

get(r -1)

))}

序列化二叉樹和反序列化二叉樹

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

序列化二叉樹

問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...

序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 序列化思路 如果二叉樹的序列化是從根節點開始的話,那麼相應的反序列化在根節點的數值對出來的時候就可以開始了,因此我們可以根據前序遍歷的的根節點數值在讀出來的時候就可以開始了,因此我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根節點開始的。當...