1.前序遍历解法
1)序列化
直接使用前序遍历序列化,需要注意的是当二叉树的节点为null时,使用"#"替代。
2)反序列化(难点)
先确定根节点 root
,然后遵循前序遍历的规则(最前面的是根节点),递归生成左右子树即可
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
String SEP = ",";
String NULL = "#";
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
//StringBuilder 可以用于高效拼接字符串
StringBuilder sb = new StringBuilder();
ser(root, sb);
return sb.toString();
}
private void ser(TreeNode root, StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return;
}
//前序遍历
sb.append(root.val).append(SEP);
ser(root.left, sb);
ser(root.right, sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
//将字符串转化成列表
LinkedList<String> nodes = new LinkedList<>();
for(String s:data.split(SEP)){
nodes.addLast(s);
}
return deser(nodes);
}
//[1,2,3,#,#,4,5]-->[[1],[2],[3],[#],[#],[4],[5]]
private TreeNode deser(LinkedList<String> nodes){
if(nodes.isEmpty()) return null;
//列表最前面是根节点
String first = nodes.removeFirst();
if(first.equals(NULL)) return null;
TreeNode root = new TreeNode(Integer.parseInt(first));
root.left = deser(nodes);
root.right = deser(nodes);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
2.后序遍历解法
1)序列化
和前序遍历解法的代码类似,只不过是变成了后序遍历
2)反序列化(难点)
root
的值是最后一个元素。从后往前取出元素,先用最后一个元素构造 root
,然后递归调用生成 root
的左右子树。注意,根据图,从后往前在 nodes
中取元素,一定要先构造 root.right
子树,后构造 root.left
子树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
String SEP = ",";
String NULL = "#";
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
ser(root, sb);
return sb.toString();
}
private void ser(TreeNode root, StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return;
}
ser(root.left, sb);
ser(root.right, sb);
sb.append(root.val).append(SEP);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
LinkedList<String> nodes = new LinkedList<>();
for(String s:data.split(SEP)){
nodes.addLast(s);
}
return deser(nodes);
}
private TreeNode deser(LinkedList<String> nodes){
if(nodes.isEmpty()) return null;
String last = nodes.removeLast();
if(last.equals(NULL)) return null;
TreeNode root = new TreeNode(Integer.parseInt(last));
//注意先构造右子树,再构造左子树
root.right = deser(nodes);
root.left = deser(nodes);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));
3.中序遍历解法(无法实现)
1)序列化
同上面两种情况类似
2)反序列化(无法实现)