1. 程式人生 > 其它 >[Leetcode]38.二叉樹的序列化和反序列化

[Leetcode]38.二叉樹的序列化和反序列化

題目:

序列化是將一個數據結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在一個檔案或者記憶體中,同時也可以通過網路傳輸到另一個計算機環境,採取相反方式重構得到原資料。

請設計一個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證一個二叉樹可以被序列化為一個字串並且將這個字串反序列化為原始的樹結構。

提示: 輸入輸出格式與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。



示例 1:

輸入:root = [1,2,3,null,null,4,5]
輸出:[1,2,3,null,null,4,5]

示例 2:

輸入:root = []
輸出:[]

示例 3:

輸入:root = [1]
輸出:[1]

示例 4:

輸入:root = [1,2]
輸出:[1,2]



提示:

樹中結點數在範圍 [0, 104] 內
-1000 <= Node.val <= 1000

思想:序列化實際上就是按照層次遍歷或先序遍歷的順序將各節點的值存放在一個字串裡。

   反序列化實際上就是把一個字串儲存的一個樹的層次遍歷或先序遍歷順序構建成一個樹。

   難點在於對於字串和分隔符的轉換和插入。

typeCodecstruct{ }
funcConstructor()Codec{ returnCodec{} }
//Serializesatreetoasinglestring. func(this*Codec)serialize(root*TreeNode)string{ ifroot==nil{ return"" } varres[]string vars[]*TreeNode
s=append(s,root) forlen(s)!=0{ vartemp[]*TreeNode for_,n:=ranges{ ifn!=nil{ res=append(res,strconv.Itoa(n.Val)) temp=append(temp,n.Left,n.Right) }else{ res=append(res,"#") } } s=temp temp=temp[0:0] } returnstrings.Join(res,",") }
//Deserializesyourencodeddatatotree. func(this*Codec)deserialize(datastring)*TreeNode{
iflen(data)==0{ returnnil } vars=strings.Split(data,",") varroot=&TreeNode{} root.Val,_=strconv.Atoi(s[0]) varqueue=[]*TreeNode{root} s=s[1:] forlen(s)>0{ ifs[0]!="#"{ l,_:=strconv.Atoi(s[0]) queue[0].Left=&TreeNode{Val:l} queue=append(queue,queue[0].Left) } ifs[1]!="#"{ r,_:=strconv.Atoi(s[1]) queue[0].Right=&TreeNode{Val:r} queue=append(queue,queue[0].Right) } s=s[2:] queue=queue[1:] } returnroot }

題目來源:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree