請實現兩個函式,分別用來序列化和反序列化二叉樹
時間限制:1秒 空間限制:32768k 熱度指數:126232
序列化:把物件轉換為位元組序列;
反序列化:把位元組序列恢復為原物件。
序列化的主要用途:
把物件的位元組序列永久地儲存到硬碟上,通常存放在乙個檔案中
在網路上傳送物件的位元組序列
思路1:
將該二叉樹進行前序遍歷、中序遍歷進行序列化和反序列化。
用該方法反序列化時的缺點:
若二叉樹中有重複值的結點,則該方法不可使用,並且必須從資料流中讀完所有的資料才可進行反序列化
思路2單純的利用前序遍歷,從根節點開始,左子樹前加『l』,右子樹前加』r』,空子樹則加』n』,這樣僅單純的利用前序遍歷即可完成序列化與反序列化。
注意:對於指標所指向的資料型別,從無到有時,必須先用new來申請空間。
在序列化時,由於題目返回型別為char*,所以先用string進行序列化,最後在轉化為char*,這樣可以僅再最後申請char的動態空間,而無需再序列化過程中實時申請。
strcat()與strcpy()需要有足夠大的空間容量才可使用,否則會出現bug。
int轉string:to_string(),詳見:
char*轉int:atoi(),詳見:
/*
struct treenode
};*/
class
solution
string a=
to_string
(root-
>val)
;//int轉string
c=c+a;
c.push_back
('l');
//左子樹前加'l'
xian
(root-
>left,c)
; c.
("r");
//右子樹前加'r'
xian
(root-
>right,c);}
char
*serialize
(treenode *root)
treenode*
deser
(char
*&str)
//反序列化
int t=
atoi
(str)
;//char*轉換為int
treenode* ro=
newtreenode
(t);
//申請樹結點
while
(str[0]
!='l'
)//查詢左子樹所在處
str++
; str++
; ro-
>left=
deser
(str)
;while
(*str!=
'r')
//查詢左子樹所在處
str++
; str++
; ro-
>right=
deser
(str)
;return ro;
} treenode*
deserialize
(char
*str)
};
該例項的int轉string、char *轉int均使用內建函式實現,亦可自己些**實現,要注意正負號。
char *的當前字元:*str或str[0]
c++ strcat():
extern char *strcat(char *dest,char *src);
功能:把src所指字串新增到dest結尾處(覆蓋dest結尾處的』\0』)並新增』\0』。
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。返回指向dest的指標。
c++中 string轉char*:建議先用new申請空間,再用strcpy。
詳見:c++中string的用法:
序列化二叉樹和反序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...
序列化二叉樹
問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...
序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 序列化思路 如果二叉樹的序列化是從根節點開始的話,那麼相應的反序列化在根節點的數值對出來的時候就可以開始了,因此我們可以根據前序遍歷的的根節點數值在讀出來的時候就可以開始了,因此我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根節點開始的。當...