序列化 反序列化二叉樹

2021-07-04 17:13:19 字數 1204 閱讀 1802

設計乙個演算法能夠實現序列化和反序列化一棵二叉樹(注意,不是二叉搜尋樹bst)。這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。

前一篇文章儲存二叉搜尋樹到檔案中  解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並從檔案中讀出重構二叉樹。因為二叉樹不一定是二叉搜尋樹,所以前面文章中的方法不能湊效。

因為二叉樹與二叉搜尋樹的性質不同,所以不能簡單的採用前面文章中的方法。不過,我們可以採用先序遍歷的思想,只是在這裡需要改動。為了能夠在重構二叉樹時結點能夠插入到正確的位置,在使用先序遍歷儲存二叉樹到檔案中的時候需要把null結點也儲存起來(可以使用特殊符號如「#」來標識null結點)。

假定二叉樹如下所示:

_30_

/   \   

1020 /     /  \50   

45  35

則使用先序遍歷,儲存到檔案中的內容如下:

30 10 50 # # # 20 45 # # 35 # #

先序遍歷的**可以完成序列化二叉樹的工作,不管你信不信,反正我是信了。**如下:

[cpp]view plain

copy

void

writebinarytree(binarytree *p, ostream &out)  

//binarytree是二叉樹結構體,typedef struct node binarytree.

else

}  從檔案中讀取二叉樹結點並重構的方法與前面相似。採用先序遍歷的思想每次讀取乙個結點,如果讀取到null結點的識別符號號「#」,則忽略它。如果讀取到結點數值,則插入到當前結點,然後遍歷左孩子和右孩子。

[cpp]view plain

copy

void

readbinarytree(binarytree *&p, ifstream &fin)   

}  除了先序遍歷,其實還可以使用層序遍歷來序列化二叉樹。此外,本文採用先序遍歷儲存null結點的方法存在缺陷,因為這樣二叉樹結點不能儲存識別符號。如本方法中二叉樹結點值就不能是「#」。如果要能儲存各種字元,則需要採用其他方法來實現了。不管怎樣,對於面試來講,這樣的解法已經可以過關了。

英文原文:

前序序列化 反序列化二叉樹

序列化 vectorserializetreepreorder treenode root preorder root return ans 反序列化 treenode deserializetreepreorder vector a,int i leetcode 331 verify preord...

序列化和反序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹。基本思想很簡單,序列化就是用某一種遍歷方法將二叉樹元素儲存在字串陣列中,當然要乙個個元素分離,分得清誰是誰。反序列化就是把儲存在字串陣列中的元素進行重構,使之成為二叉樹。我們不妨選擇前序遍歷的思想進行搜尋與重構。本題的關鍵是如何對元素進行儲存,可以放在...

二叉樹 序列化與反序列化

序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...