思路:
示例1所示的二叉树如果用leetcode的标准转换为字符串后,应为[,1,2,3,null,null,4,5,null,null] ,题目中写的其实是省去了开头的逗号和最后两个null的。[,1,2,3,null,null,4,5,null,null] 其实就是二叉树的层序遍历的结果,而且结果中要保存null。
我们可以很容易通过队列写出二叉树的层序遍历的结果,保存在字符串中作为序列化的结果输出:
public String serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
if(root==null)
{return sb.toString();}
Deque<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty())
{
TreeNode top = que.poll();
if(top==null)
{
sb.append(",null");
continue;
}
else
{
sb.append(","+top.val);
que.offer(top.left);
que.offer(top.right);
}
}
return sb.toString();
}
下面我们来看从字符串生成一个二叉树:
[,1,2,3,null,null,4,5,null,null]
我们把这个字符串按照逗号分割,生成一个字符串数组
["",“1”,“2”,”3“,”null“,“null”,”4“,”5“,”null“,”null“] 注意第0个元素是一个空字符串。
其实也是二叉树的层序遍历,首先我们生成根节点1,将根节点加入队列。
进入循环,设一个指针i,一开始指向第2位(从0开始),也就是2节点。
首先将队首元素出队,然后生成指针i 和 指针i+1位置处的2,3节点,将2,3节点连接到刚刚出队的节点上,再将2,3节点入队。然后将指针加2。继续循环。
将队首元素出队,此时指针指向第4位,也就是”null“节点。将指针i 和 指针i+1位置处的null节点连接到刚刚出队的队首元素上。然后将两个null 入队。将指针加2,继续循环。
重复上述操作,直到指针i>字符串数组长度为止。
返回根节点。
public TreeNode deserialize(String data) {
String[] dt = data.split(",");
if(dt.length<2)
return null;
Deque<TreeNode> que = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(dt[1]));
que.offer(root);
int i=2;
while(i<dt.length)
{
TreeNode top = que.poll();
if(top == null)
continue;
if(dt[i].equals("null"))
top.left=null;
else
top.left=new TreeNode(Integer.parseInt(dt[i]));
que.offer(top.left);
if(dt[i+1].equals("null"))
top.right=null;
else
top.right=new TreeNode(Integer.parseInt(dt[i+1]));
que.offer(top.right);
i += 2;
}
return root;
}