序列化是將乙個資料結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在乙個檔案或者記憶體中,同時也可以通過網路傳輸到另乙個計算機環境,採取相反方式重構得到原資料。
請設計乙個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證乙個二叉樹可以被序列化為乙個字串並且將這個字串反序列化為原始的樹結構。
說明: 不要使用類的成員 / 全域性 / 靜態變數來儲存狀態,你的序列化和反序列化演算法應該是無狀態的。
題目的意思還是比較明確的,首先給定乙個樹,我們需要先將樹轉化為序列(serialize),然後再將這個序列轉換為樹原本的樣子(deserialize),呼叫的形式為deserialize(serialize(root));而這中間的樹到序列、序列到樹的轉換規則由自己決定,只要最終序列化後再反序列得到的結果與最初的樹相同即可。
首先即是對樹的序列化,對樹的序列化有多種方法:前序序列、後序序列、中序序列以及層次序列,序列化的方法都是相類似的,就不多說了,以前序序列為例,即建立乙個字串,對樹進行前序遍歷,並把遍歷結果存放到樹中。這裡說兩點我在這犯了的錯誤,乙個是樹上每個結點並非都是個位數,因此在遍歷的時候應當將每個結點當做字串而不是當做字元進行遍歷,空節點節點當做「#」或其他標識;除此之外,字串相互之間需要有間隔符,間隔符的選取一定要注意,「-」短橫線是不行的,因為樹結點可能是負數,這樣間隔符就會與結點有衝突。
然後就是反序列化了,反序列化實際上就是根據前面得到的序列構造樹,根據前序序列構造樹是比較容易的,需要注意的是,這裡能夠光通過前序序列構造樹的原因是,在最初生成序列的時候將空節點補充為「#」,這樣得到的序列實際上是乙個完全二叉樹的前序序列,完全二叉樹只需要一種序列即可。
接下來還需要考慮的是,序列中存在間隔符,因此還應當根據間隔符來將各結點值給讀出來,乙個比較簡單的辦法是將各結點值按序讀出後放入佇列中,接下來以此從隊首取出資料來遞迴構建二叉樹即可。
**如下:
string serialize(treenode* root)
return res;
}// decodes your encoded data to tree.
treenode* deserialize(string data)
return buildtree(node);
}treenode* buildtree(queue& node)
二叉樹的序列化與反序列化 二叉樹
序列化是將乙個資料結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在乙個檔案或者記憶體中,同時也可以通過網路傳輸到另乙個計算機環境,採取相反方式重構得到原資料。請設計乙個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 反序列化演算法執行邏輯,你只需要保證乙個二叉樹可以被序列...
序列化二叉樹和反序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...