目錄請實現兩個函式,分別用來序列化和反序列化二叉樹?
序列化的意思是指將一些特定的資料結構,變成有格式資訊的字串。例如對乙個鍊錶,可以將1->2->3->4->null序列化為"1,2,3,4"。對於序列化演算法,必須支援反序列化,即在約定的格式下,可以將滿足格式要求的字串重新構造為原始的結構形式。
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果string,重構出原始的二叉樹結構。
拿到這個題目,我們面臨著兩個至關重要的問題:
1、題目是要求序列化二叉樹,對於二叉樹這種資料結構,很可能存在著空節點,那麼,對於空節點,該怎麼表示呢?
2、題目要求實現二叉樹的反序列化,我們按照將二叉樹序列化為乙個字串的前提,對於乙個字串,我們怎麼區分出每個獨立的二叉樹的節點呢?
以上兩個問題,在很多刷題**會直接給出結論或者結果,這樣降低了題目的難度,但作為面試者需要清楚,即使沒有提示我們也要注意到這兩點問題。即空節點用特殊字元"#"表示,每個節點用逗號「,」分割。也就是反序列化的時候遇到#那麼就表示該節點為空節點,可以結束該字元的遍歷了。而拆分節點的時候我們只需要取出兩個逗號之間的資料即是該節點的值。
1.序列化二叉樹,借助string型別來拼接序列化的字串。只需要前序遍歷二叉樹,當遇到根節點為空時,追加"#",並退出遞迴,否則追加二叉樹的根節點值,接著追加逗號。接下來只需遞迴實現左子樹和右子樹的序列化。那麼,序列化之後就得到了string型別的字串。
2.反序列化二叉樹,如果string為空,則直接返回退出。如果遇到"#",則為空節點,退出遞迴。否則,找到字元陣列中的乙個二叉樹節點值,然後構造根節點,如果此時到達字元末尾,直接返回根節點,否則繼續遍歷。接下來根結點的左右指標分別連線左子樹的遞迴實現結果和右子樹的遞迴實現結果。
//二叉樹結構
struct treenode
};
//序列化二叉樹
//to_string將每個結點的val值轉化為string型別儲存在str上。
void serialize(treenode* node, string& s)
s += to_string(node->val);
s.push_back(',');
serialize(node->left, s);
serialize(node->right, s);
}//反序列化二叉樹
treenode* deserialize(string& s)
treenode* node = new treenode(stoi(s));
s = s.substr(s.find_first_of(',') + 1);
node->left = deserialize(s);
node->right = deserialize(s);
return node;
}
問題1. 將題目中的節點值型別由int換為string,我們還能用"#"來表示空節點嗎?還能用","來分割節點嗎?
問題2. serialize裡使用了"+=",他的複雜度是怎樣的,請分析一下?
提示一下,問題1,解決的思路類似於網路請求中請求引數的處理。問題2,主要是考察了string的操作符過載的過程。
二叉樹 序列化與反序列化
序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...
二叉樹序列化與反序列化
層序遍歷 實現二叉樹的序列化與反序列化。序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...