最近無聊寫寫題,又看到這個序列化的題,牛客網序列化二叉樹
之前有過兩種方式實現1
2,序列化的過程好理解,反序列化則是分別利用先序+中序遍歷序列遞迴重建二叉樹或者根據每個節點位置和值迭代方式重建二叉樹。這兩種序列化的實現都需要額外的空間,序列化後的序列都至少需要兩倍的原始節點值空間。
那是否可以有更優雅、更節省空間的序列化方式呢?答案是肯定的。
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過某種符號表示空節點(#),以只有先序遍歷序列能夠重新構造二叉樹嗎?可以!!
表示乙個結點值的結束(value!)。二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。
此題已經提示了用某種符號表示空節點,這樣包含中止葉子節點(空節點)的二叉樹遍歷序列其實是可以直接用來重建二叉樹的。
/*
struct treenode
};*/
class solution else
}treenode* buildtree(int *&p)
treenode *t = new treenode(*p);
++p;
t->left = this->buildtree(p);
t->right = this->buildtree(p);
return t;
}treenode* deserialize(char *str)
};
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def serialize(self, root):
# write code here
self.ans = ""
self.preorder(root)
return self.ans
def preorder(self, root):
if root:
self.ans += "%d|" % root.val
self.preorder(root.left)
self.preorder(root.right)
else:
self.ans += "#|"
def buildtree(self, s, pos=0):
if s[pos]=='#':
return none, pos+2
val = 0
for i in range(pos, len(s)):
ch = s[i]
if ch!='|':
val = val*10 + int(ch)
else:
pos = i+1
break
t = treenode(val)
t.left, pos = self.buildtree(s, pos)
t.right, pos = self.buildtree(s, pos)
return t, pos
def deserialize(self, s):
# write code here
return self.buildtree(s)[0]
二叉樹 序列化與反序列化
序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...
二叉樹序列化與反序列化
層序遍歷 實現二叉樹的序列化與反序列化。序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...