春天來的時候,總覺得會發生點什麼,但是到頭來,什麼都沒發生,然後就覺得自己錯過了點什麼。
——《立春》
leetcode:297. 二叉樹的序列化與反序列化
描述:序列化是將乙個資料結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在乙個檔案或者記憶體中,同時也可以通過網路傳輸到另乙個計算機環境,採取相反方式重構得到原資料。
請設計乙個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證乙個二叉樹可以被序列化為乙個字串並且將這個字串反序列化為原始的樹結構。
不要使用類的成員 / 全域性 / 靜態變數來儲存狀態,你的序列化和反序列化演算法應該是無狀態的。實際上考的是二叉樹的遍歷。這個大學時候講過:前序遍歷(中左右)、中序遍歷(左中右)、後續遍歷(左右中)。這道題中還有乙個層次遍歷的概念。
1:幾種遍歷方法都差不多,故選了前序遍歷的方法。
2:樹一般都使用遞迴的思路來實現。
public
class
codec
return result;
}/**
* 前序遍歷的序列化
* @param root 節點
* @return 已拼接的字串
*/public string tree2string
(treenode root)
else
return str;
}public treenode deserialize
(string data)
string[
] strs = data.
split
(",");
treenode node =
newtreenode
(integer.
valueof
(strs[0]
));string2tree
(node, strs,0)
;return node;
}/**
* 前序遍歷的反序列化
* @param node 當前節點
* @param strs 序列化結果
* @param i 指標
* @return 指標
*/public
intstring2tree
(treenode node, string[
] strs,
int i)
//處理右節點
i++;if
(!"x".
equals
(strs[i]))
}//返回指標
感覺還行,其他幾種遍歷方式就不嘗試了,大抵上是差不多的。
官方題解
用括號來包裹子樹的序列化,最終的模式:(t) num (t)
num為當前節點的值,左側t為左子樹序列化,右側t為右子樹序列化,也採用括號包裹的方式。
這種方法讓我想起了檢測成對括號的方法,在spring檢測佔位符時,就有檢測成對括號的方法。簡而言之遞迴吧。
二叉樹 序列化與反序列化
序列化 serialization 在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式 例如存成檔案,存於緩衝,或經由網路中傳送 以留待後續在相同或另一台計算機環境中,能恢復原先狀態的過程。從一系列位元組提取資料結構的反向操作,是反序列化 也稱為解編組 deserialization ...
二叉樹序列化與反序列化
層序遍歷 實現二叉樹的序列化與反序列化。序列化二叉樹的方式有很多,最經典的就是將一顆二叉樹轉化為字串,這樣方便儲存到檔案。反序列化時只需解析這個字串,提取出每個節點的內容資訊,將二叉樹還原。二叉樹序列化有許多應用,比如 oj 平台在判斷你提交的二叉樹是否正確時,往往是將你的二叉樹序列化成字串,然後與...
序列化 反序列化二叉樹
設計乙個演算法能夠實現序列化和反序列化一棵二叉樹 注意,不是二叉搜尋樹bst 這裡的序列化指的是將一棵二叉樹儲存到檔案中,反序列化就是從檔案中讀取二叉樹結點值重構原來的二叉樹。前一篇文章儲存二叉搜尋樹到檔案中 解決了儲存一棵二叉搜尋樹到檔案中的問題,但是由於本題目的意思是要把一棵二叉樹儲存到檔案中並...