按照 leetcode 的官方習慣,二叉樹的序列化邏輯是根據其「層次遍歷」序列來實現的(參考該文章),因此本文以這種方式來解題。
對於反序列化過程,其輸入是乙個字串,我們需要將其轉換為vector
,如"1,null,2"
需要轉換為.
vectorsplit(string &data, const string &sep)
if (l < data.length())
result.emplace_back(data.substr(l));
return result;
}
對於vector
中的每個元素,構造乙個 api,返回對應的二叉樹節點(包括空節點):
treenode *generatenode(const string &s)
其次,需要 2 個常量(以成員變數的形式存在),nil
是空節點的符號表示,separator
是序列化字串中的分隔符:
const string nil = "null";
const string separator = ",";
與一般的層次遍歷幾乎一樣,唯一不同的地方是:在此處,空節點nullptr
也進入佇列當中。
❗ 需要注意的是:最後一層均為葉子節點,因此它們的左右孩子均為null
,按照 leetcode 的要求,序列化字串中不包含這些最後一層葉子節點的孩子。
string levelserialize(treenode *root)
else
result.emplace_back(nil);
}while (result.back() == nil) result.pop_back();
string str;
for (auto &x : result) str += (x + separator);
if (str.back() == separator[0]) str.pop_back();
return "[" + str + "]";
}
還是是普通的層次遍歷演算法改過來的~
treenode *leveldeserialize(string &data)
return root;
}
二叉樹 序列化與反序列化
序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...
二叉樹序列化與反序列化
層序遍歷 實現二叉樹的序列化與反序列化。序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...