3 3 二叉樹的序列化和反序列化

2021-10-22 14:27:03 字數 2684 閱讀 3707

二叉樹被記錄成檔案的過程叫作二叉樹的序列化,通過檔案內容重建原來二叉樹的過程叫 作二叉樹的反序列化。給定一棵二叉樹的頭節點 head,已知二叉樹節點值的型別為 32 位整型。 請設計一種二叉樹序列化和反序列化的方案,並用**實現。

思路1: 通過先序遍歷實現序列化

class

node

:def

__init

(self, data)

: self.value = data

self.right =

none

self.left =

none

defserialbypreorder

(head: node)

:"""先序遍歷序列化二叉樹"""

if head is

none

:return

"#!"

res = f"!"

serialbypreorder(head.left)

serialbypreorder(head.right)

from queue import queue

defreconbypreorderstr

(prestr)

: values = prestr.split(

"!")

q = queue(

)for i in

range

(len

(values)):

q.put(vales[i]

)return reconbypreorder(q)

defreconbypreorder

(q):

"""先序遍歷重構二叉樹"""

val = q.poll(

)if val ==

"#":

return

none

head = node(val)

head.left = reconbypreorder(q)

head.right = reconbypreorder(q)

return head

思路2: 通過層遍歷。

class

node

:def

__init

(self, data)

: self.value = data

self.right =

none

self.left =

none

from queue import queue

defserialbylevel

(head: node)

:"""層序遍歷序列化二叉樹"""

if head is

none

:return

"#!"

res = f"!"

q = queue(

) q.put(head)

while

not q.empty():

node = q.get(

)if node.left is

notnone

: res += f"!"

q.put(node.left)

else

: res +=

"#!"

if node.right is

notnone

: q.put(node.right)

else

: res +=

"#!"

return res

defserialbylevelstr

(levelstr)

: values = levelstr.split(

"!")

index =

0# 找到頭結點

head = generatenodebystring(values[index]

) index +=

1 q = queue(

)if head is

notnone

: q.put(head)

while

not q.empty():

node = q.poll(

)# 找到左邊節點

node.left = generatenodebystring(index)

index +=

1# 找到右邊節點

node.right = generatenodebystring(index)

index +=

1# 如果左邊節點不為none,繼續找這個節點的子節點

if node.left is

notnone

: q.put(node.left)

# 如果右邊節點不為none,繼續找這個節點的子節點

if node.right is

notnone

: q.put(node.right)

return head

defgeneratenodebystring

(val)

:if val ==

"#":

return

none

return node(val)

序列化 反序列化二叉樹

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

序列化和反序列化二叉樹

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

序列化和反序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點 以 表示...