二叉樹序列化 反序列化 層次遍歷python

2021-08-21 16:03:01 字數 3281 閱讀 9962

給定一棵二叉樹,要求進行分層遍歷,每層的節點值單獨列印一行,下圖給出事例結構:

增加兩個treenode:last和nlast

(本質,就是每當某個節點的左右孩子進入佇列,該節點被彈出,如果該節點等於last值,預設遍歷完該層節點,之後另last=nlast,之後再碰到彈出的值與last值相等,繼續上述操作)

從根結點開始,將根結點放入佇列①,之後彈出根結點①,每彈出乙個結點就先後將其左右結點②③放入佇列中,由於佇列先進先出,因此先取出的是②,然後將④⑤放入到佇列中,然後從佇列中取出乙個結點,由於佇列先進新出,此時取出的是之前放入的③,再將⑤⑥放入佇列,再將⑦8放入佇列中,此時彈出的是⑤,由於從第二層開始總是從左到右放入佇列,下一層的結點一定是在當前層的結點之後才放入並且也是從左到右放入的,因此總體順序必然是從上到下,從左到右的。

白話描述:last=1,nlast=2,3即其左右孩子,輸出左右孩子後,佇列中彈出1,1==last,此時last=nlast=3(賦值操作),因為2先進入佇列,佇列中進入其左孩子,彈出2,再進入3的左右孩子,nlast=5,6,彈出3,此時彈出的3==last,故新last=nlast=6(賦值操作),nlast=7,8,彈出5,又6沒有左右孩子,彈出6==last,此時last=nlast=8(賦值操作),7沒有孩子節點,彈出7,再彈出8=last=nlast,列印完畢(即last=nlast完全相等時說明列印完畢) 。

(1)二叉樹序列化(持久化)

即:二叉樹–》字串

二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。

(2)二叉樹反序列化

即:字串–》二叉樹

二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。

class

bintree

(object):

def__init__

(self,x):

self.val=x

self.left=none

self.right=none

class

solution

(object):

#二叉樹的反序列化:

#通過對乙個列表的處理,來完成反序列化,即從根節點開始,每完成乙個節點的左右孩子處理,即刪除該點,同時列表新增該點的左右孩子節點,

#依次類推,直到所有節點被處理完,此時,列表中應當沒有節點,因此while條件是列表長度不為0

defstrtotree

(self,strlist):

if len(strlist)==0

or strlist==none:

return

none

first=strlist.pop(0)

#找到根節點

root=bintree(first)

re_list=

while len(re_list)!=0:

left=strlist.pop(0)

right=strlist.pop(0)

if left!='#!'

and right!='#!':

binleft=bintree(left)

binright=bintree(right)

re_list[0].left=binleft

re_list[0].right=binright

re_list.pop(0)

elif left=='#!'

and right!='#!':

binright=bintree(right)

re_list[0].right=binright

re_list.pop(0)

elif left!='#!'

and right=='#!':

binleft=bintree(left)

re_list[0].left=binleft

re_list.pop(0)

else:

re_list.pop(0)

return root

#二叉樹的序列化(思想是有兩個列表,把放樹的那個列表依次移到新的列表中並刪除原來對應的部分,

#其中也轉化形式,直到放樹的列表中所有引數移完為止,因此列表的迴圈條件是原來放樹的列表長度不為0)

defseralize

(self,root):

temp,ch=[root],

while len(temp)!=0:

m=temp.pop(0)

if m==none:

else:

return ch

#二叉樹的層次遍歷列印輸出:

#方法一(23ms.5708k):

defprint

(self, root):

# write code here

last,nlast=root,root

queue,xiangtaoqueue=[root],

newqueue=

while len(queue)!=0:

m=queue.pop(0)

if m.left!=none:

nlast=m.left

if m.right!=none:

nlast=m.right

if m==last:

last=nlast

newqueue=

return xiangtaoqueue

#方法二:(29ms,5604k)

defprint

(self, root):

ifnot root:

return

nodestack = [root]

result =

while nodestack:

res =

nextstack =

for i in nodestack:

if i.left:

if i.right:

nodestack = nextstack

return result

s = solution()

root = s.strtotree(strlist =['a!', 'b!', 'c!', '#!', 'd!', '#!', 'e!', 'f!', '#!', '#!', '#!', '#!', '#!'])

s.cengciprint(root)

序列化 反序列化二叉樹

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

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

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

序列化和反序列化二叉樹

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