請實現兩個函式,分別用來序列化和反序列化二叉樹
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。
例如,我們可以把乙個只有根節點為1的二叉樹序列化為"1,",然後通過自己的函式來解析回這個二叉樹
鴿了好久的劍指offer,今天回來看序列化二叉樹這道題。前端的話可能會對序列化比較熟悉(不就是json字串嘛),這道題的序列化就是把樹變成可以解析的json字串,而反序列化是通過json字串還原樹的結構。
一提到樹,尤其是二叉樹,就想到了遞迴、迭代,先看遞迴吧,用dfs的思路,從根節點開始,對左右子樹分別進行序列化,最後相加起來。在反序列化的時候,劃分出結點並壓入佇列中,根據前序遍歷逐個取出建樹。
採用迭代的思路(bfs),也同理。序列化是,用佇列儲存每一層的結點,按層序遍歷優先從左子樹的根節點開始擴充套件,擴充套件完了再擴充套件右子樹。反序列化則將字串拆解,然後從佇列裡取結點,每兩個結點作為當前結點的左右結點。
// 遞迴(dfs)
// 序列化
varserialize
=function
(root)
;// 反序列化
const
buildtree
=(list)
=>
vardeserialize
=function
(data)
;// 迭代(bfs)
// 序列化
const
serialize
=(root)
=>
else
}return res.
join
(',')}
// 反序列化
const
deserialize
=(data)
=>
if(rightval !==
'null'
) cursor +=
2// 指標前進2位
}return root
}
劍指offer JS題解 10 矩形覆蓋
我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?n 3時,2 3的矩形塊有3種覆蓋方法。依然是斐波那契數列,首先考慮起始的情況 當n 1時,只有一種覆蓋方法 當n 2時,可以全橫或者全豎,有兩種覆蓋方法 當n 2時,無非...
劍指offer(61)序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 首先拿到題目時候,我先想到的是什麼是序列化二叉樹?序列化主要就是在前後端互動時候需要轉換下,畢竟網路傳輸的是流式資料 二進位制或者文字 而不是物件。所以序列化二叉樹就是轉化成字串。之前解決重建二叉樹問題時候,我們可以知道,兩個遍歷序列就可以確定一顆二叉...
劍指Offer 61 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 使用前序遍歷,將遇到的結點新增到字串中,遇到null則將乙個 新增要序列化字串中。反序列化時,每次讀取根結點,然後讀取其左結點,遇到 null 時,返回上層。樹結點定義 public class treenode 實現 public class sol...