二叉樹之序列化和反序列化
分析:使用先序遍歷,假設序列化的結果字串為str,初始為str=""。如果遇到null就在str的結尾加”#!”,“#”表示這個節點為空,節點值不存在,"!”表示一個值的結束;如果遇到不為空的節點,在每一個節點值的後面都要加上"!",防止值疊加在一起,因為分層會出錯。反序列化,重構二叉樹,按照先序遍歷建立二叉樹。
public class TreeToString {
public String toString(TreeNode root) {
// write code here
String ss= serialByPre(root);
return ss;
}
public String serialByPre(TreeNode head){
if(head==null){
return "#!";
}
String res=head.val+"!";
res+=serialByPre(head.left);
res+=serialByPre(head.right);
return res;
}
public TreeNode reconByPreString(String preStr){
String[] values=preStr.split("!");
Queue<String> queue=new LinkedList<>();
for(int i=0;i<values.length;i++){
queue.offer(values[i]);
}
return reconPreOrder(queue);
}
public TreeNode reconPreOrder(Queue<String> queue){
String value=queue.poll();
if(value.equals("#")){
return null;
}
TreeNode head=new TreeNode(Integer.valueOf(value));
head.left=reconPreOrder(queue);
head.right=reconPreOrder(queue);
return head;
}
}