二叉樹序列化與反序列化

2021-10-05 15:58:42 字數 3013 閱讀 2380

層序遍歷

實現二叉樹的序列化與反序列化。

序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與正確答案的序列化字串進行比較。那麼如何將一顆二叉樹轉化成字串呢?字串可以認為是線性結構。以某種二叉樹遍歷的順序將二叉樹線性化,可以很容易建立節點與字元的對映關係。下面將分別實現先序遍歷和層序遍歷下的二叉樹序列化及反序列化。

按照先序遍歷的順序將二叉樹每個節點的值域轉換成字串,並新增到整個序列化字串的後面。每兩個節點之間新增 「_」 加以區分,如果節點為 null.

將字串以 「_」 進行分割,並用先序遍歷的順序依次建立新節點加入樹中。可以用乙個佇列儲存這些分割後子串,方便管理。

class

serialize

string res = head.element +

"_";

// 將節點的域值新增到序列化字串後面

res +=

serializepreorder

(head.left)

;// 遞迴遍歷左子樹

res +=

serializepreorder

(head.right)

;// 遞迴遍歷右子樹

return res;

}public

static node deserializebyprestring

(string str)

return

deserialpreorder

(nodequeue)

;// 呼叫 deserialpreorder 還原二叉樹

}private

static node deserialpreorder

(queue

nodequeue)

node thisnode =

newnode

(integer.

valueof

(node));

// 用字串的值初始化乙個節點

thisnode.left =

deserialpreorder

(nodequeue)

;// 遞迴建立左子樹

thisnode.right =

deserialpreorder

(nodequeue)

;// 遞迴建立右子樹

return thisnode;

}// 二叉樹節點類

static

class

node

private

node

(int x, node right, node left)

}public

static

void

main

(string[

] args)

}

out:

1_2_4_null_null_5_null_null_3_null_null_

1 2 3 4 5

按照層序遍歷的順序將二叉樹每個節點的值域轉換成字串,並新增到整個序列化字串的後面。每兩個節點之間新增 「_」 加以區分,如果節點為 null.

將字串以 「_」 進行分割,並用層序遍歷的順序依次建立新節點加入樹中。

class

serialize

// 按層序遍歷順序序列化

public

static string serializelevelorder

(node head)

queue

nodes =

newlinkedlist

<

>()

;

string rst =

"";

nodes.

offer

(head)

;// 根節點加入佇列

node node;

// 當前節點

while

(!nodes.

isempty()

)

rst +=

(node.element +

"_")

;// 當前節點非空,將節點值域轉化成字串新增到序列化字串後面

nodes.

offer

(node.left)

;// 當前節點左兒子入隊

nodes.

offer

(node.right)

;// 當前節點右兒子入隊

}return rst;

}// 通過層序序列化字串反序列化

public

static node deserializebylevelstring

(string str)

if(thisnode.right != null)

}return root;

// 返回根節點

}// 將字串轉化成 node

private

static node getnode

(string[

] serialization,

int idx)

return

newnode

(integer.

valueof

(serialization[idx]))

;// 返回轉化後的節點

}

out:

1_2_3_4_5_null_null_null_null_null_null_

1 2 3 4 5

二叉樹 序列化與反序列化

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

序列化 反序列化二叉樹

設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...

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

順便說一下,今天做題的時候也用到了stringstream這個類,是二叉樹的序列化和反序列化。設計乙個演算法,並編寫 來序列化和反序列化二叉樹。將樹寫入乙個檔案被稱為 序列化 讀取檔案後重建同樣的二叉樹被稱為 反序列化 如何反序列化或序列化二叉樹是沒有限制的,你只需要確保可以將二叉樹序列化為乙個字串...