my_leetcode/java/src/com/iqiaoxu/code/Codec.java

136 lines
4.0 KiB
Java

package com.iqiaoxu.code;
import com.iqiaoxu.code.structure.TreeNode;
import java.util.LinkedList;
import java.util.List;
public class Codec {
private void serialize(TreeNode root, List<Integer> values) {
if (root != null) {
values.add(root.val);
serialize(root.left, values);
serialize(root.right, values);
} else {
values.add(Integer.MAX_VALUE);
}
}
public String serialize(TreeNode root) {
List<Integer> values = new LinkedList<>();
serialize(root, values);
char[] chars = new char[values.size() * 2];
int i = 0;
for (Integer v : values) {
chars[i] = (char) ((v >>> 16) & 0xFFFF);
chars[i + 1] = (char) (v & 0xFFFF);
i += 2;
}
return new String(chars);
}
private TreeNode deserialize(LinkedList<Integer> values) {
Integer v = values.pop();
if (v != Integer.MAX_VALUE) {
TreeNode t = new TreeNode(v);
t.left = deserialize(values);
t.right = deserialize(values);
return t;
} else {
return null;
}
}
public TreeNode deserialize(String data) {
char[] chars = data.toCharArray();
LinkedList<Integer> values = new LinkedList<>();
for (int i = 0; i < chars.length; i += 2) {
values.add(((chars[i] & 0xffff) << 16) | (chars[i + 1] & 0xffff));
}
return deserialize(values);
}
public static void main(String[] args) {
TreeNode n1 = new TreeNode(1);
TreeNode n2 = new TreeNode(2);
TreeNode n3 = new TreeNode(3);
TreeNode n4 = new TreeNode(4);
TreeNode n5 = new TreeNode(5);
n3.left = n4;
n3.right = n5;
n1.left = n2;
n1.right = n3;
List<Integer> values = new LinkedList<>();
Codec codec = new Codec();
codec.serialize(n1, values);
System.out.println(values);
String s = codec.serialize(n1);
System.out.println(s);
TreeNode root = codec.deserialize(s);
System.out.println(1);
}
/*private void serialize(TreeNode root, List<Integer> values) {
if (root != null) {
values.add(root.val);
serialize(root.left, values);
serialize(root.right, values);
} else {
values.add(0x7FFF);
}
}
public String serialize(TreeNode root) {
List<Integer> values = new LinkedList<>();
serialize(root, values);
char[] chars = new char[values.size()];
int i = 0;
for (Integer v : values) {
chars[i++] = (char) (v & 0xFFFF);
}
return new String(chars);
}
private TreeNode deserialize(LinkedList<Integer> values) {
Integer v = values.pop();
if (v != 0x7FFF) {
TreeNode t = new TreeNode(v > 0x7FFF ? v | 0xFFFF0000 : v);
t.left = deserialize(values);
t.right = deserialize(values);
return t;
} else {
return null;
}
}
public TreeNode deserialize(String data) {
char[] chars = data.toCharArray();
LinkedList<Integer> values = new LinkedList<>();
for (char c : chars) {
values.add((int) c);
}
return deserialize(values);
}
public static void main(String[] args) {
TreeNode n1 = new TreeNode(1);
TreeNode n2 = new TreeNode(2);
TreeNode n3 = new TreeNode(3);
TreeNode n4 = new TreeNode(4);
TreeNode n5 = new TreeNode(-100);
n3.left = n4;
n3.right = n5;
n1.left = n2;
n1.right = n3;
List<Integer> values = new LinkedList<>();
Codec codec = new Codec();
codec.serialize(n1, values);
System.out.println(values);
String s = codec.serialize(n1);
System.out.println(s);
TreeNode root = codec.deserialize(s);
System.out.println(1);
}*/
}