思路:
方法一:前序的遍历与构建二叉树。
序列化:前序遍历二叉树。
反序列化:前序构建二叉树。
Result:AC。
例如:树
1
/ \
2 3
\
4
序列化后为: [1, 2, null, null, 3, null, 4, null, null]
java code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
ArrayList<Integer> ans = new ArrayList<Integer>();
sHelper(root, ans);
return ans.toString();
}
private void sHelper(TreeNode root, ArrayList<Integer> ans) {
if(root == null) {
ans.add(null);
return;
}
ans.add(root.val);
sHelper(root.left, ans);
sHelper(root.right, ans);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data == null) return null;
data = data.substring(1, data.length() - 1);
String[] nodesVal = data.split(", ");
Deque<String> strList = new LinkedList<String>(Arrays.asList(nodesVal));
return dHelper(strList);
}
private TreeNode dHelper(Deque<String> strList) {
if(strList.size() == 0) return null;
String str = strList.pop();
if(str.equals("null")) {
return null;
}
TreeNode cur = new TreeNode(Integer.parseInt(str));
cur.left = dHelper(strList);
cur.right = dHelper(strList);
return cur;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
方法二:层序的遍历与构建二叉树。
序列化:层序遍历二叉树。
反序列化:层序构建二叉树。
Result:TLE。
例如:树
1
/ \
2 3
\
4
序列化后为: [1,2,3,null,null,null,4,null,null]
java code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null) return null;
String ans = "[";
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
ans += root.val;
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
if(cur.left != null) {
ans += "," + cur.left.val;
queue.add(cur.left);
}else {
ans += ",null";
}
if(cur.right != null) {
ans += "," + cur.right.val;
queue.add(cur.right);
}else {
ans += ",null";
}
}
ans += "]";
return ans;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data == null) return null;
data = data.substring(1, data.length() - 1);
String[] nodesVal = data.split(",");
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode root;
int loc = 0;
if(nodesVal.length == 0) {
return null;
}else {
root = new TreeNode(Integer.parseInt(nodesVal[loc++]));
queue.add(root);
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
int count = 0;
while(count != 2) {
count++;
if(!nodesVal[loc].equals("null")) {
TreeNode child;
if(loc % 2 == 0) {//not odd
child = new TreeNode(Integer.parseInt(nodesVal[loc]));
cur.right = child;
}else {//odd
child = new TreeNode(Integer.parseInt(nodesVal[loc]));
cur.left = child;
}
queue.add(child);
}else {
if(loc % 2 == 0) {//not odd
cur.right = null;
}else {//odd
cur.left = null;
}
}
loc++;
}
}
}
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));