Serialize and Deserialize Binary Tree

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;




public class SerializeandDeserializeBST {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;


TreeNode(int x) {
val = x;
}
}

    public String serialize(TreeNode root) {
        if(root==null){
        return "";
        }
        StringBuilder encoded=new StringBuilder();
        encode(root,encoded);
        return encoded.substring(1).toString();//因为第一个元素是“,”所以返回除去,号后的元素到最后
    }
    //讲树变为string  序列化的过程
    private void encode(TreeNode root, StringBuilder sb) {
    if(root==null){
    sb.append(",#"); //结尾的元素添加“,#”
    return;
    }
    sb.append(",").append(root.val); //每个数值前都添加,
    encode(root.left,sb);//左子树序列化
    encode(root.right,sb); //右子树序列化
}
    //讲字符串按“,”解压,然后放到queue中
public TreeNode deserialize(String data) {
if(data.length()==0){
return null;
}
Queue q=new LinkedList<>(Arrays.asList(data.split(",")));//讲字符串按照“,”号分隔,变成数组后,压入队列中
return decode(q);
    }

//将string变回树
private TreeNode decode(Queue q) {
if(q.isEmpty()){//如果全部queue都poll玩,就返回。
return null;
}
String  cur=q.poll();//queue弹出当前值,此时的q是过来一个整体。q.poll是弹出当前的第一个元素
if(cur.equals("#")){//如果当前元素是结尾元素字符#,则返回null
return null;
}
TreeNode root=new TreeNode(Integer.valueOf(cur));//新建TreeNode,以当前cur为value
root.left=decode(q);//刚刚那个作为root,因为进来的方式是前序遍历,所以先是左子树。递归。
root.right=decode(q);//左子树完成后,进行右子树递归
return root;//最后返回跟节点
}
public static void main(String[] args) {
String data="a,b,c,d,e,f,g";
List asList = Arrays.asList(data.split(","));
Queue q=new LinkedList<>(asList);
q.poll();
System.out.println(q.peek());
String encoded="abcdefg";
System.out.println(encoded.substring(1).toString());
}
}

你可能感兴趣的:(LeetCode)