136 lines
4.0 KiB
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);
|
|
}*/
|
|
}
|