问题描述:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个九四u安吉环境,采用相反的重构方式得到原数据,请设计一个算法实现二叉树的序列化于反序列化,这里不限定你的序列/反序列化算法执行逻辑,只需要保证一个二叉树可以被序列为一个字符串并且这个字符串反序列化为原始的树结构。
BFS求解:在序列化的时候,将每个节点放入队列中,如果退出来的元素为空,则在String中放入'#',否则放入该节点的数字。
public String Serialize(TreeNode root)
{
String res="";
Queue<TreeNode>queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty())
{
int queueSize=queue.size();
for(int i=0;i<queueSize;i++)
{
TreeNode TempNode;
queue.add(TempNode.left);
queue.add(TempNode.right);
TempNode=queue.poll();
if(res!=null)
{
if(TempNode==null)
{
String+=','+'#';
}else
{
String+=','+TempNode.val;
}
}else
{
if(TempNode==null)
{
String+='#';
}else
{
String+=TempNode.val;
}
}
}
}
return res;
}
public TreeNode deSerialize(String seria)
{
if(seria.equls("#")){return null;}
String data[]=seria.split(',');
Queue<TreeNode>queue=new LinkedList<>();
TreeNode root=new TreeNode();
root.val=data[0];
queue.add(root)
//由于除了顶点所有的节点都是成对出现的,从而根据成对进行判断
for(int i=1;i<data.length;i++)
{
TreeNodem parent=queue.poll();
if(!"#".equals(data[i]))
{
TreeNode left=new TreeNode();
left.val=Integer.parseInt(data[i]);
parent.left=left;
queue.add(left);
}
if(!"#".equals(data[++i]))
{
TreeNode right=new TreeNode();
left.val=Integer.parseInt(data[i]);
???????parent.right=right;
queue.add(left);
}
}
return root;
}
DFS求解:通过先序遍历不停的往下走,遇到不是null的情况放入数组中,遇到为null的情况,则放入'#'于数组之中,表示遍历到这里的时候为空。
?
public String serialize(TreeNode root)
{
if(root==null){return "#";}
return root.val+","+serialize(root.left)+","+serialize(root.right);
}
publid TreeNode helper(String[]data,Queue<String>res)
{
String deal=res.poll();
if("#".equals(deal)){return null;}
TreeNode root=new TreeNode();
root.left=helper(data,res);
root.right=helper(data,res);
???????return root;
}
public TreeNode deSerialize(String seria)
{
//将结果装在在一个队列中,每遍历一个,就退出一个
Queue<String>queue=new LinkedList<>(Array.asList(seria.split(',')));
return helper(queue);
}