题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
解题思路
序列化:利用二叉树的前序遍历让后加上“#” “!”。
反序列化:利用结束符"!"分割出每个节点的值然后按顺序添加每个节点。
代码实现
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
String Serialize(TreeNode root) {
if(root==null) return null;
StringBuilder s=new StringBuilder();
SerializeHelper(root,s);
return s.toString();
}
//前序遍历
private void SerializeHelper(TreeNode root,StringBuilder s){
if(root==null){
s.append("#!");
return;
}else{
s.append(root.val).append("!");
SerializeHelper(root.left,s);
SerializeHelper(root.right,s);
}
}
TreeNode Deserialize(String str) {
if(str==null||str =="") return null;
//利用结束符"!"分割出每个节点的值
String[] strs=str.split("!");
return DeserializeHelper(strs);
}
private int index=-1;
private TreeNode DeserializeHelper(String[] strs){
index++;
//按顺序添加每个节点
if(!strs[index].equals("#")){
TreeNode node=new TreeNode(Integer.parseInt(strs[index]));
node.left=DeserializeHelper(strs);
node.right=DeserializeHelper(strs);
return node;
}
return null;
}
}