题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
思路:
基于之前的层级输出
用队列存储
反序列化也类似
可以举一反三
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
String Serialize(TreeNode root) {
if(root == null)
{
return "";
}
StringBuilder sb = new StringBuilder("");
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode current = null;
queue.offer(root); //将根节点入队
while(!queue.isEmpty())
{
current = queue.poll();//出队队头元素并访问
if (current.val!=-1){
sb.append(","+current.val);
}else {
sb.append(",#");
}
if (current.left==null&¤t.right==null){
continue;
}
if(current.left != null)//如果当前节点的左节点不为空入队
{
queue.offer(current.left);
}else{
queue.offer(new TreeNode(-1));
}
if(current.right != null)//如果当前节点的右节点不为空,把右节点入队
{
queue.offer(current.right);
}else {
queue.offer(new TreeNode(-1));
}
}
return sb.toString().substring(1);
}
TreeNode Deserialize(String str) {
TreeNode root = null;
if(!str.equals("")){
String[] list = str.split(",");
//先建立根节点
root = new TreeNode(Integer.parseInt(list[0]));
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);//把需要插入左右节点的元素放在队列中管理,一旦左右子树建立之后就从队列中移除
int index = 1;
while(!queue.isEmpty() && index < list.length){
TreeNode temp = queue.poll();
if(!list[index].equals("#")){
TreeNode newLeft = new TreeNode(Integer.parseInt(list[index]));
temp.left = newLeft;
index ++;
queue.offer(newLeft);
}else
index ++;//所有的if都应该配备else,不然真的很容易出错误
if(index < list.length && !list[index].equals("#")){
TreeNode newRight = new TreeNode(Integer.parseInt(list[index]));
temp.right = newRight;
index ++;
queue.offer(newRight);
}else
index++;//所有的if都应该配备else,不然真的很容易出错误
}
}
return root;
}
}