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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章