思路:序列化,我们可以从题目上看出序列化是按照层数去序列化,并且是从左到右的打印。所以很明显。这种序列化就是按层打印二叉树。使用队列,将当前节点放入队列,再遍历左右孩子再入队,最后toString返回即可。
反序列化:反序列化我们同样采用一个队列,我们遍历字符串。index 表示遍历的字符下标初始值为0。
第一步 :index下标的值new一个节点,也就是root,并且入队。
第二步,给当前对头的节点左孩子new 一个节点,值为index下标,然后index++ ,给右孩子new 一个 新的节点,index++。此时,当前对头出队,左右孩子只要不为空就入队。
第三步:只要队列中还有节点,就一直重复第二步。
最后返回root节点即可。
// Encodes a tree to a single string.
public static String serialize(TreeNode root) {
if(root == null) return "";
ArrayList<Integer> result = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
//首先将根节点入队
queue.add(root);
//每处理完一个节点就出队一个节点。
while(!queue.isEmpty()){
//当前对头节点的值添加到结果集中
TreeNode current = queue.peekFirst();
if(current != null) {
result.add(current.val);
//把左右孩子入队。
queue.add(current.left);
queue.add(current.right);
}else {
result.add(null);
}
//当前对头出队
queue.pollFirst();
}
return result.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String res = data.substring(1,data.length()-1);
String[] values = res.split(",");
int index = 0;
TreeNode root = grenateNode(values[index++]);
//按照队列的形式new节点
LinkedList<TreeNode> queue = new LinkedList<>();
//让根节点入队
queue.add(root);
while(!queue.isEmpty()){
//对头出队
TreeNode treeNode = queue.pollFirst();
//生成孩子节点
treeNode.left = grenateNode(values[index++]);
treeNode.right = grenateNode(values[index++]);
//孩子节点入队
if(treeNode.left!=null)
queue.add(treeNode.left);
if(treeNode.right!=null)
queue.add(treeNode.right);
}
return root;
}
private TreeNode grenateNode(String number){
if(number.equals("null")) return null;
return new TreeNode(Integer.parseInt(number));
}