public class Codec {
//二叉树的序列化
String SEP = ",";
String NULL = "null";
String serialize(TreeNode root){
StringBuilder sb = new StringBuilder();
serialize(root, sb);
return sb.toString();
}
void serialize(TreeNode root, StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return ;
}
/* 先序操作 */
sb.append(root.val).append(SEP);
serialize(root.left, sb);
serialize(root.right, sb);
}
//二叉树的反序列化
TreeNode deserialize(String data){
LinkedList<String> nodes = new LinkedList<>();
for (String s : data.split(SEP)){
nodes.addLast(s);
}
return deserialize(nodes);
}
TreeNode deserialize(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 = deserialize(nodes);
root.right = deserialize(nodes);
return root;
}
}
解题思路
数据结构
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int data){
this.val = data;
}
}
递归先序遍历
void preOrder(TreeNode root){
if(root == null){
return ;
}
/* 先序遍历代码 */
System.out.println(root.val);
preOrder(root.left);
preOrder(root.right);
}
递归先序遍历并保存值在数组中
LinkedList<Integer> res;
void traverse(TreeNode root){
if(root == null){
res.addLast(-1);
return;
}
/* 先序遍历代码 */
res.addLast(root.val);
traverse(root.left);
traverse(root.right);
}
递归先序遍历保存值在字符串中
//递归先序保存在字符串中
//分隔符
String SEP = ",";
//代表null空指针的字符
String NULL = "#";
//用于拼接字符串
StringBuilder sb = new StringBuilder();
void traverse(TreeNode root, StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return ;
}
*//* 先序遍历代码 *//*
sb.append(root.val).append(SEP);
traverse(root.left, sb);
traverse(root.right, sb);
}