(1)題目
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹(注意,不是二叉搜尋樹bst)。這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。
(2)思路
前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並從檔案中讀出重構二叉樹。因為二叉樹不一定是二叉搜尋樹,所以前面文章中的方法不能湊效。
(3)解法
因為二叉樹與二叉搜尋樹的性質不同,所以不能簡單的採用前面文章中的方法。不過,我們可以採用先序遍歷的思想,只是在這裡需要改動。
為了能夠在重構二叉樹時結點能夠插入到正確的位置,在使用先序遍歷儲存二叉樹到檔案中的時候需要把null結點也儲存起來(可以使用特殊符號如「#」來標識null結點)。
假定二叉樹如下所示:
_30_
/ \
10 20
/ / \
50 45 35
則使用先序遍歷,儲存到檔案中的內容如下:
30 10 50 # # # 20 45 # # 35 # #
(4)序列化二叉樹
先序遍歷的**可以完成序列化二叉樹的工作,不管你信不信,反正我是信了。**如下:
void writebinarytree(binarytree *p, ostream &out) //binarytree是二叉樹結構體,typedef struct node binarytree.
else
} (5)反序列化二叉樹
從檔案中讀取二叉樹結點並重構的方法與前面相似。採用先序遍歷的思想每次讀取乙個結點,如果讀取到null結點的識別符號號「#」,則忽略它。如果讀取到結點數值,則插入到當前結點,然後遍歷左孩子和右孩子。
void readbinarytree(binarytree *&p, ifstream &fin)
} (6)拓展:
除了先序遍歷,其實還可以使用層序遍歷來序列化二叉樹。
此外,本文採用先序遍歷儲存null結點的方法存在缺陷,因為這樣二叉樹結點不能儲存識別符號。
如本方法中二叉樹結點值就不能是「#」。如果要能儲存各種字元,則需要採用其他方法來實現了。不管怎樣,對於面試來講,這樣的解法已經可以過關了。
二叉樹 序列化與反序列化
序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...
二叉樹序列化與反序列化
層序遍歷 實現二叉樹的序列化與反序列化。序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...