左神讲过,可`以采用先序遍历,后续和中序,其实怎么序列就怎么反过来
/**
* 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.
int count=-1;
public String serialize(TreeNode root) {
//先序序列化
if(root==null){
return "null,";
}
String str=root.val+",";
str+=serialize(root.left);
str+=serialize(root.right);
return str;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] s=data.split(",");
return de(s);
}
public TreeNode de(String[] s){
count++;
if("null".equals(s[count]))
{
return null;
}
TreeNode node=new TreeNode(Integer.valueOf(s[count]));
node.left=de(s);
node.right=de(s);
return node;
}
}
难点在层次的序列化和反序列化,因为层次的貌似只能非递归??,我自己尝试在leetcode编写,没通过。。以后再试试把
public static String serialByLevel(Node head) {
if (head == null) {
return "#!";
}
String res = head.value + "!";
Queue<Node> queue = new LinkedList<Node>();
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
if (head.left != null) {
res += head.left.value + "!";
queue.offer(head.left);
} else {
res += "#!";
}
if (head.right != null) {
res += head.right.value + "!";
queue.offer(head.right);
} else {
res += "#!";
}
}
return res;
}
public static Node reconByLevelString(String levelStr) {
String[] values = levelStr.split("!");
int index = 0;
Node head = generateNodeByString(values[index++]);
Queue<Node> queue = new LinkedList<Node>();
if (head != null) {
queue.offer(head);
}
Node node = null;
while (!queue.isEmpty()) {
node = queue.poll();
node.left = generateNodeByString(values[index++]);
node.right = generateNodeByString(values[index++]);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
return head;
}