請實現兩個函數,分別用來序列化和反序列化2叉樹
甚么是序列化?
可以理解為1直存儲結構
序列化后還要可以反序列化
對樹的序列號,可以理解為層次遍歷,但是也要記錄其中的空結點,這是為了能夠回去
我們知道可以從前序遍歷和中序遍歷構造出1棵2叉樹。受此啟發,我們可以先把1棵2叉樹序列化成1個前序遍歷序列和1個中序序列,然后再反序列化時通過這兩個序列重構出原2叉樹。
這個思路有兩個缺點。1個缺點是該方法要求2叉樹中不能用有數值重復的結點。另外只有當兩個序列中所有數據都讀出后才能開始反序列化。如果兩個遍歷序列的數據是從1個流里讀出來的,那便可能需要等較長的時間。
實際上如果2叉樹的序列化是從根結點開始的話,那末相應的反序列化在根結點的數值讀出來的時候就能夠開始了。因此我們可以根據前序遍歷的順序來序列化2叉樹,由于前序遍歷是從根結點開始的。當在遍歷2叉樹碰到 NULL 指針時,這些 NULL 指針序列化成1個特殊的字符(比如‘#’)。另外,結點的數值之間要用1個特殊字符(比如’,’)隔開。
public class Solution {
String Serialize(TreeNode root) {
if(root == null)
return "";
StringBuilder sb = new StringBuilder();
Serialize(root, sb);
return sb.toString();
}
void Serialize(TreeNode root, StringBuilder sb) {
if(root == null) {
sb.append("#,");
return;
}
sb.append(root.val);
sb.append(',');
Serialize(root.left, sb);
Serialize(root.right, sb);
}
int index = -1;
TreeNode Deserialize(String str) {
if(str.length() == 0)
return null;
String[] strs = str.split(",");
return Deserialize(strs);
}
TreeNode Deserialize(String[] strs) {
index++;
if(!strs[index].equals("#")) {
TreeNode root = new TreeNode(0);
root.val = Integer.parseInt(strs[index]);
root.left = Deserialize(strs);
root.right = Deserialize(strs);
return root;
}
return null;
}
}