问题
请实现两个函数,分别用来序列化和反序列化二叉树。
例子
思路
中间转化成的字符串随意,只要最后能还原二叉树即可
为空是,使用“#”代替
中序遍历不行,因为没法知道根结点在哪【但是也可以通过在给右子树加括号来实现】
-
方法1
$$$$
先序+队列
-
方法2
$$$$
后序+栈
-
方法3
层次遍历
序列化后的反序列化
代码
//方法1
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
preOrder(root,sb);
//把最后一个多余的","去掉
return sb.deleteCharAt(sb.length()-1).toString();
}
public void preOrder(TreeNode root, StringBuilder sb) {
if(root==null) {
sb.append("null,");
return;
}else{
sb.append(root.val+",");
preOrder(root.left,sb);
preOrder(root.right,sb);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String s) {
String[] arr = s.split(",");
Queue<String> q = new LinkedList<>();
for(String temp : arr) q.offer(temp);
return get(q);
}
public TreeNode get(Queue<String> q) {
String temp = q.poll();
if(temp.equals("null")) return null;
TreeNode node = new TreeNode(Integer.valueOf(temp));
node.left = get(q);
node.right = get(q);
return node;
}
}
//方法2
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
postOrder(root,sb);
//把最后一个多余的","去掉
return sb.deleteCharAt(sb.length()-1).toString();
}
public void postOrder(TreeNode root, StringBuilder sb) {
if(root==null) {
sb.append("#,");
return;
}else{
postOrder(root.left,sb);
postOrder(root.right,sb);
sb.append(root.val+",");
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String str) {
String[] arr = str.split(",");
Stack<String> s = new Stack<>();
for(String temp : arr) s.push(temp);
return get(s);
}
public TreeNode get(Stack<String> s) {
String temp = s.pop();
if(temp.equals("#")) return null;
TreeNode node = new TreeNode(Integer.valueOf(temp));
node.right = get(s);
node.left = get(s);
return node;
}
}
//层次遍历
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root==null) return "";
StringBuilder sb = new StringBuilder();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(q.size()>0) {
TreeNode node = q.poll();
if(node==null) sb.append("#,");
else{
sb.append(node.val+",");
q.offer(node.left);
q.offer(node.right);
}
}
//把最后一个,去掉
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.length()==0) return null;
String[] arr = data.split(",");
Queue<TreeNode> q = new LinkedList<>();
int i = 0;
TreeNode root = new TreeNode(Integer.valueOf(arr[i++]));
q.offer(root);
while(q.size()>0) {
TreeNode node = q.poll();
if(node==null) continue;
String left = arr[i++];
String right = arr[i++];
if(left.equals("#"))
node.left=null;
else
node.left = new TreeNode(Integer.valueOf(left));
if(right.equals("#"))
node.right=null;
else
node.right = new TreeNode(Integer.valueOf(right));
q.offer(node.left);
q.offer(node.right);
}
return root;
}
}