劍指offer(61)序列化二叉樹

2022-03-10 08:13:39 字數 910 閱讀 2417

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

首先拿到題目時候,我先想到的是什麼是序列化二叉樹?序列化主要就是在前後端互動時候需要轉換下,畢竟網路傳輸的是流式資料(二進位制或者文字),而不是物件。

所以序列化二叉樹就是轉化成字串。

之前解決重建二叉樹問題時候,我們可以知道,兩個遍歷序列就可以確定一顆二叉樹。(比如前序遍歷序列和中序遍歷序列)。

受此啟發,序列化時候我們可以生成乙個前序遍歷序列和乙個中序遍歷序列,在反序列化時通過這兩個序列重構出原二叉樹。

但是當我們細細想下,這個思路有兩個個缺點就是:

1.如果二叉樹有數值重複的節點,那麼必須區分誰是前序遍歷序列,誰是後序遍歷序列。

2.只有當兩個序列所有資料讀出後才能開始反序列化。

因此我們可以想,既然是可以邊讀,邊構建二叉樹,你是不是想到了自己平時如何構建二叉樹的?

我們可以通過深度遍歷或者廣度遍歷序列都行,當然我們最終選擇了深度優先遍歷,畢竟可以不用額外的空間。

此外還有個技巧就是為了更好地知道遍歷某個子樹的結束,也就是當我們遍歷到null時,我們需要用換位符(比如$)代表,方便反序列化。

此外,我嘗試過用字串做發現不好做,然後轉變了下思路,用陣列來模擬流,發現就好做了很多。

此外,利用反序列化,我們可以通過陣列很快的生成我們想要的二叉樹,然後拿去做測試,畢竟乙個乙個的建立節點,生成二叉樹太傻了

const arr =;

function

serialize(proot)

else

}function

deserialize()

const number =arr.shift();

if (typeof number === 'number')

return

node;

}

劍指Offer 61 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 使用前序遍歷,將遇到的結點新增到字串中,遇到null則將乙個 新增要序列化字串中。反序列化時,每次讀取根結點,然後讀取其左結點,遇到 null 時,返回上層。樹結點定義 public class treenode 實現 public class sol...

劍指offer 61 序列化二叉樹 python

請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點 以 表示...

劍指offer 61平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。題解 方法一 使用深度遍歷,判斷每個節點是不是平衡二叉樹,這種從上至下的方法會導致底層的節點重複判斷多次 方法二 使用後序遍歷判斷,這種方法為自下而上,每個節點只需要判斷一次即可 1 方法一 使用深度遍歷,判斷每個節點是不是平衡二叉樹,這種從上至下的方法...