leecode 297 二叉樹的序列化與反序列化

首先是簡單的層序遍歷

  • 序列化時:搞個隊列,層序遍歷,記錄成”**,“的形式,值得注意的是,Java中設計頻繁的字符串修改時,不要使用String,選擇StringBuffer或StringBuilder代替。原因是String是不可變對象,每次修改都會new對象從而產生較大的功耗。
  • 反序列化時:同樣建個隊列,挨個獲取字符串中的數據,逐個爲節點添加左右節點。因爲之前序列化的時候就是採用這個順序。
  • 代碼:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.LinkedList;
import java.util.Queue;
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        //層序遍歷 
        StringBuffer ss = new StringBuffer("");
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(node==null){
                ss= ss.append("null,");
                continue;
            }
            else ss.append(""+node.val+",");
            queue.offer(node.left);
            queue.offer(node.right);
        }
        return ss.toString();    
    
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data==null||data.equals("null,")) return null;
        Queue<TreeNode> queue = new LinkedList<>();
        String[] slist = data.split(",");
        TreeNode root = new TreeNode(Integer.parseInt(slist[0]));
        queue.offer(root);
        int i=1;
        while(i<slist.length){
            TreeNode node = queue.poll();
            if(node!=null){
                //左兒子
                if(slist[i].equals("null"))node.left=null;
                else{
                    TreeNode leftNode = new TreeNode(Integer.parseInt(slist[i]));
                    node.left=leftNode;
                    queue.offer(leftNode);
                }
                //右兒子
                i++;
                if(slist[i].equals("null"))node.right=null;
                else{
                    TreeNode rightNode = new TreeNode(Integer.parseInt(slist[i]));
                    node.right=rightNode;
                    queue.offer(rightNode);
                }
                i++;
            }
        }
        return root;
        
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

然後是bfs 其實就是先序遍歷。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.LinkedList;
import java.util.Queue;
public class Codec {

    // Encodes a tree to a single string.
    
    public void dfs(TreeNode node, StringBuffer ss){
        if(node==null){
            ss.append("null,");
            return;
        }
        ss.append(""+node.val+',');
        dfs(node.left,ss);
        dfs(node.right,ss);
        return;
    }
    public String serialize(TreeNode root) {
        //先序遍歷 dfs;
        StringBuffer ss = new StringBuffer("");
        dfs(root,ss);
        return ss.toString();
    }
    public TreeNode dfs2(String[] slist,int[] index){
        if(index[0]>=slist.length||slist[index[0]].equals("null")){
            index[0]++;
            return null;
        }
        TreeNode node = new TreeNode(Integer.parseInt(slist[index[0]]));
        index[0]++;
        node.left=dfs2(slist,index);
        node.right=dfs2(slist,index);
        return node;
    }
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data==null||data.equals("null,")) return null;
        return dfs2(data.split(","),new int[]{0});
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章