劍指offer JS題解 61 序列化二叉樹

2021-10-08 01:15:30 字數 1227 閱讀 3198

請實現兩個函式,分別用來序列化和反序列化二叉樹

二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(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...