1. 程式人生 > >二叉樹之序列化和反序列化

二叉樹之序列化和反序列化

分析:使用先序遍歷,假設序列化的結果字串為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;
        }
        
}