二叉搜尋樹的序列化與反序列化

2021-08-14 21:40:05 字數 1561 閱讀 4070

注:**

(1)二叉搜尋樹的序列化與反序列化:

(1.0)背景:

二叉樹的序列化,即將二叉樹按照某種遍歷方法將各個節點的 值保持到檔案中;

二叉樹的反序列化,即根據檔案中的值或者給出乙個陣列,然後來構造乙個二叉樹;

(1.1)問題:

設計乙個演算法,將一棵二叉搜尋樹(binary search tree,bst)儲存到檔案中,需要能夠從檔案中恢復原來的二叉搜尋樹。注意演算法的時空複雜度。

(1.2)思路:

二叉樹遍歷演算法有先序遍歷、中序遍歷、後序遍歷演算法等。但是它們中間只有一種遍歷演算法符合題目條件,用於儲存bst到檔案中並從檔案中恢復原來的bst。

假定我們要儲存的bst如下:

_ 30_

/    \   

20     40

/      / \

10    35  50

1.2.1)中序遍歷

如果我們對該bst進行中序遍歷,可以得到10 20 30 35 40 50,但是我們無法從中推斷出原始的二叉搜尋樹結構。輸出為10 20 30 35 40 50,一種可能的bst結構如下所示,這是一棵不平衡的bst,顯然這不是原來的bst。

_50/      

40 /   35/

30/20/

101.2.2)後序遍歷

既然中序遍歷不能滿足條件,那麼看看後序遍歷如何?後序遍歷在列印出父結點之前列印葉子結點。後序遍歷該bst可以得到:10 20 35 50 40 30 。讀取這些結點並構造出原來的bst是個難題,因為在構造二叉樹時是先構造父結點在插入孩子結點,而後序遍歷序列是先讀取到孩子結點然後才是父結點,所以也不符合條件。

1.2.3)先序遍歷

中序遍歷與後序遍歷都不滿足條件,只有先序遍歷是可以滿足條件的。bst的先序遍歷結果為:30 20 10 40 35 50。我們觀察到重要的一點就是:

乙個結點的父親結點總是在該結點之前輸出。

有了這個觀察,我們從檔案中讀取bst結點序列後,總是可以在構造孩子結點之前構造它們的父結點。將bst寫入到檔案的**跟先序遍歷一樣。

(1.3) 反序列化:

1.3.1) 現在的問題是,如何從讀取的結點序列中重新構造bst?

簡單的辦法就是對於每個結點,使用二叉搜尋樹insert方法執行n次插入操作,每次插入需要時間o(lgn),這樣總共需要o(nlgn)的時間。這個方法不夠高效。

即相當於是給定乙個陣列,根據該陣列構造乙個二叉搜尋樹;

解法:回顧前面文章,判定一棵二叉樹是否是二叉排序樹 中的解法2採用了範圍判定來判斷每個節點是否符合條件。

這裡採用類似的思想給出乙個更為高效的解法用於從檔案中重新構建原來的二叉搜尋樹。我們從父結點傳遞乙個有效的範圍到孩子結點。

當我們要插入結點時,判斷該插入結點是否在有效範圍,如果是則插入,否則尋找乙個新的位置進行插入。整個時間複雜度為o(n)。

void readbsthelper(int min, int max, int &insertval,

struct node *&p, ifstream &fin) }}

void readbst(struct node *&root, ifstream &fin) 

序列化和反序列化二叉搜尋樹

序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同乙個或另乙個計算機環境中重建。設計乙個演算法來序列化和反序列化二叉搜尋樹。對序列化 反序列化演算法的工作方式沒有限制。您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化...

二叉樹 序列化與反序列化

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

二叉樹序列化與反序列化

層序遍歷 實現二叉樹的序列化與反序列化。序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與...