Binary Tree Serialization
An example of testdata: Binary tree {3,9,20,#,#,15,7}, denote the following structure:
3
/ \
9 20
/ \
15 7
{3,9,20,#,#,15,#,#,7,#,#,}
public class Codec {
public String serialize(TreeNode root) {
if (root == null) {
return "{}";
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
StringBuilder sb = new StringBuilder();
sb.append("{");
while(!queue.isEmpty()){
TreeNode cur = queue.poll();
if (cur == null) {
sb.append("#,");
} else {
sb.append(cur.val);
sb.append(",");
queue.offer(cur.left);
queue.offer(cur.right);
}
}
sb.append("}");
return sb.toString();
}
/**
* This method will be invoked second, the argument data is what exactly
* you serialized at method "serialize", that means the data is not given by
* system, it's given by your own serialize method. So the format of data is
* designed by yourself, and deserialize it here as you serialize it in
* "serialize" method.
*/
public TreeNode deserialize(String data) {
if (data.equals("{}")) {
return null;
}
String[] vals = data.substring(1, data.length() - 1).split(",");
ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
queue.add(root);
int index = 0;
boolean isLeftChild = true;
for (int i = 1; i < vals.length; i++) {
if (!vals[i].equals("#")) {
TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
if (isLeftChild) {
queue.get(index).left = node;
} else {
queue.get(index).right = node;
}
queue.add(node);
}
if (!isLeftChild) {
index++;
}
isLeftChild = !isLeftChild;
}
return root;
}
}
ebay变形题目,要求不是二叉树,child有一个list
我的表示方法{3@2,9@0,20@2,15@1,7@2,21@0,8@0,10@0,}
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class TreeNode{
int val;
List<TreeNode> next;
public TreeNode(int val){
this.val = val;
this.next = new ArrayList<TreeNode>();
}
}
class Point{
TreeNode node;
int size;
public Point(TreeNode node, int size){
this.node = node;
this.size = size;
}
}
public class serialize {
public static String serialize(TreeNode root) {
if (root == null) {
return "{}";
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
StringBuilder sb = new StringBuilder();
sb.append("{");
while(!queue.isEmpty()){
TreeNode cur = queue.poll();
sb.append(cur.val);
sb.append("@");
sb.append(cur.next.size());
sb.append(",");
if(cur.next.size() != 0){
for(TreeNode temp : cur.next){
queue.offer(temp);
}
}
}
sb.append("}");
return sb.toString();
}
public static TreeNode deserialize(String data) {
if (data.equals("{}")) {
return null;
}
String[] vals = data.substring(1, data.length() - 1).split(",");
ArrayList<Point> queue = new ArrayList<Point>();
String[] val = vals[0].split("@");
TreeNode root = new TreeNode(Integer.parseInt(val[0]));
Point point = new Point(root,Integer.parseInt( val[1]));
queue.add(point);
int index = 0;
int count = 0;
for (int i = 1; i < vals.length; i++) {
if(queue.get(index).size == count ){
count = 0;
index++;
i--;
continue;
}
String[] cur = vals[i].split("@");
TreeNode node = new TreeNode(Integer.parseInt(cur[0]));
queue.get(index).node.next.add(node);
Point next_point = new Point(node, Integer.parseInt(cur[1]));
queue.add(next_point);
count++;
}
return root;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode root = new TreeNode(3);
TreeNode t9 = new TreeNode(9);
TreeNode t20 = new TreeNode(20);
TreeNode t15 = new TreeNode(15);
TreeNode t7 = new TreeNode(7);
TreeNode t21 = new TreeNode(21);
TreeNode t8 = new TreeNode(8);
TreeNode t10 = new TreeNode(10);
root.next.add(t9);
root.next.add(t20);
t20.next.add(t15);
t20.next.add(t7);
t15.next.add(t21);
t7.next.add(t8);
t7.next.add(t10);
System.out.println(serialize(root) );
TreeNode cur = deserialize(serialize(root));
System.out.println(serialize(cur) );
}
}