題目描述:請實現兩個函式,分別用來序列化和反序列化二叉樹
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。
序列化指的是將乙個記憶體物件轉化成一串位元組資料(儲存在乙個位元組陣列中),可用於儲存到本地檔案或網路傳輸。反序列化就是將位元組資料還原成記憶體物件。
const * char c_str()乙個將string轉換為 const* char的函式 string的c_str()返回的指標是由string管理的。它的生命期是string物件的生命期。然後可以按c的方式使用這個指標,或把它的內容複製出來。
先序遍歷實現
void
pre_order
(treenode *root)
// process root
// ...
pre_order
(root-
>left)
;pre_order
(root-
>right)
;}
對於本題來說,可以套用上述模板。
假設序列化的結果為字串 str, 初始str = 「」.根據要求,遇到nullptr節點,str += 「#」
遇到非空節點,str += 「val」 + 「!」; 假設val為3, 就是 str += 「3!」
所以,最終的**為:
char
*serialize
(treenode *root)
string res=
to_string
(root-
>val)
;//對於不為空的值加入字串
res.
push_back
('!');
//在結點值的最後加上!後面反序列化會方便
char
* left=
serialize
(root-
>left)
;//遞迴的遍歷左右子樹
char
* right=
serialize
(root-
>right)
;char
* ret=
newchar
[strlen
(left)
+strlen
(right)
+res.
size()
];//新建char* 用於拼接所有結果
// 如果是string型別,直接用operator += ,這裡char* 需要用函式
strcpy
(ret, res.
c_str()
);strcat
(ret, left)
;strcat
(ret, right)
;return ret;
}
反序列化的結果,就是根據先序遍歷,再重建二叉樹即可。
**如下:
// 引數使用引用&, 以實現全域性變數的目的
treenode*
deseri
(char
*&s)
// 構造根節點值
int num =0;
while
(*s !=
'!')
++s;
// 遞迴構造樹
treenode *root =
newtreenode
(num)
; root-
>left =
deseri
(s);
root-
>right =
deseri
(s);
return root;
}treenode*
deserialize
(char
*str)
序列化二叉樹和反序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...
序列化二叉樹
問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...
序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 序列化思路 如果二叉樹的序列化是從根節點開始的話,那麼相應的反序列化在根節點的數值對出來的時候就可以開始了,因此我們可以根據前序遍歷的的根節點數值在讀出來的時候就可以開始了,因此我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根節點開始的。當...