請實現兩個函式,分別用來序列化和反序列化二叉樹
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。
(1)序列化比較簡單,就是將二叉樹進行乙個前序遍歷,儲存在乙個string中,每個空節點存成「#!」,非空節點存成「value!」,最後將string型別複製到char*陣列中。
(2)反序列化相對而言麻煩點:
1》計算每個節點的長度len,若str[idx]是『#』代表空節點返回null,將索引號後移len+1,調到後乙個節點;
2》對於非空節點,判斷其正負,賦值給value,建立樹節點,下面就是對左右節點遞迴賦值操作。
前序遍歷序列化,反序列化。
struct treenode };
class
solution
void
dfs1
(treenode* root,string & tmp)
tmp +
=to_string
(root-
>val)
+'!'
;dfs1
(root-
>left, tmp)
;dfs1
(root-
>right, tmp);}
//反序列化//
treenode*
deserialize
(char
* str)
treenode*
dfs2
(char
* str,
int& idx)
//(2)對於非空節點,計算數值,轉化成二叉樹val值
int tag =1;
//標籤值,若為正則為1,若為負,則為-1;
if(str[idx]
=='-'
&& idx < len)
int value =0;
//計算節點的值;
for(
int i = idx; i < len;
++i)
value *
= tag;
idx=len+1;
//idx移到下乙個節點。
treenode* root =
newtreenode
(value)
; root-
>left =
dfs2
(str, idx)
; root-
>right =
dfs2
(str, idx)
;return root;}}
;
劍指offer 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹。首先得理解題目的意思,序列化就是返回乙個帶有 和逗號的字串。反序列化就是根據帶有 和逗號的字串返回一棵二叉樹。比如對於二叉樹 1 2 3 4 5 6 7來講,序列化的結果是1,2,3,4,7,5,而反序列化的結果則是輸出一棵二叉樹。public cla...
劍指Offer 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 根據前面的面試題重建二叉樹,我們知道可以從前序遍歷和中序遍歷構造出一棵二叉樹。受此啟發,我們可以先把一棵二叉樹序列化成乙個前序遍歷序列和乙個中序序列的結合,然後再反序列化時通過這兩個序列重構出原二叉樹。但是這個思路有兩個缺點。乙個缺點是該方法要求二叉樹...
劍指offer 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 首先這道題目是要有兩個問題,第乙個是把一棵二叉樹按照前序遍歷的方式變成乙個字串。第二個是把乙個字串變成乙個二叉樹。對於第乙個問題來說,我們要對這棵樹進行乙個前序遍歷,按照中左右的方式放入列表中,如果節點為空,則插入 最後.join 來實現列表到字串的轉...