請實現兩個函式,分別用來序列化和反序列化二叉樹
首先拿到題目時候,我先想到的是什麼是序列化二叉樹?序列化主要就是在前後端互動時候需要轉換下,畢竟網路傳輸的是流式資料(二進位制或者文字),而不是物件。
所以序列化二叉樹就是轉化成字串。
之前解決重建二叉樹問題時候,我們可以知道,兩個遍歷序列就可以確定一顆二叉樹。(比如前序遍歷序列和中序遍歷序列)。
受此啟發,序列化時候我們可以生成乙個前序遍歷序列和乙個中序遍歷序列,在反序列化時通過這兩個序列重構出原二叉樹。
但是當我們細細想下,這個思路有兩個個缺點就是:
1.如果二叉樹有數值重複的節點,那麼必須區分誰是前序遍歷序列,誰是後序遍歷序列。
2.只有當兩個序列所有資料讀出後才能開始反序列化。
因此我們可以想,既然是可以邊讀,邊構建二叉樹,你是不是想到了自己平時如何構建二叉樹的?
我們可以通過深度遍歷或者廣度遍歷序列都行,當然我們最終選擇了深度優先遍歷,畢竟可以不用額外的空間。
此外還有個技巧就是為了更好地知道遍歷某個子樹的結束,也就是當我們遍歷到null時,我們需要用換位符(比如$)代表,方便反序列化。
此外,我嘗試過用字串做發現不好做,然後轉變了下思路,用陣列來模擬流,發現就好做了很多。
此外,利用反序列化,我們可以通過陣列很快的生成我們想要的二叉樹,然後拿去做測試,畢竟乙個乙個的建立節點,生成二叉樹太傻了
const arr =
;function
serialize
(proot)
else
}function
deserialize()
const number = arr.
shift()
;if(typeof number ===
'number'
)return node;
}
序列化二叉樹和反序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...
序列化二叉樹
問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...
序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 序列化思路 如果二叉樹的序列化是從根節點開始的話,那麼相應的反序列化在根節點的數值對出來的時候就可以開始了,因此我們可以根據前序遍歷的的根節點數值在讀出來的時候就可以開始了,因此我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根節點開始的。當...