序列号与反序列化 297_449

297. Serialize and Deserialize Binary Tree

对一颗二叉树实现序列化与反序列化。

  1. 通过前序遍历二叉树,将所有结点中的值加入字符串中,对于null,加入*字符
  2. 反序列化也是递归的方法,把字符串转换为一个字符串队列,可以简化反序列化
  3. 从队列中推出一个字符串,如果不是*,就创建一个结,如果是*,就返回null结点。然后以剩下的队列作为参数创建一个子树作为该结点的左子树,同理构建右子树,直到队列中没有字符串。

例:12**34**5**

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuffer sb = new StringBuffer("");
        helper1(root, sb);
        return sb.toString();
    }

    public void helper1(TreeNode root, StringBuffer sb) {
        if (root == null) {
            sb.append("*").append(",");
            return;
        }
        sb.append(root.val).append(",");
        helper1(root.left, sb);
        helper1(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        Queue<String> queue = new LinkedList<>(Arrays.asList(data.split(",")));
        return helper2(queue);
    }

    public TreeNode helper2(Queue<String> queue) {
        if (queue.isEmpty()) return null;

        String temp = queue.poll();
        if (temp.equals("*")) return null;
        int val = Integer.parseInt(temp);
        TreeNode node = new TreeNode(val);
        node.left = helper2(queue);
        node.right = helper2(queue);
        return node;
    }
}

449. Serialize and Deserialize BST

和上题类似,只是二叉树变成了bst,所以可以针对的优化。

对空结点不用添加*进行标识了,因为bst左子树都比根结点小,右子树都比根结点大的特性,就可以通过记录每个结点所允许的值范围来判断该结点是否合法,如果在范围内就创建结点,不在就返回null结点:

例:5|314|78,这里可以判断314在5的左子树,78在5的右子树

public class Codec {

        public String serialize(TreeNode root) {
        StringBuffer sb = new StringBuffer("");
        seriHelper(root, sb);
        return sb.toString();
    }

    public void seriHelper(TreeNode root, StringBuffer sb) {
        if (root == null) return;
        sb.append(root.val).append(",");
        seriHelper(root.left, sb);
        seriHelper(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data.isEmpty()) return null;
        Queue<String> queue = new LinkedList<>(Arrays.asList(data.split(",")));
        return deseHelper(queue, Integer.MIN_VALUE, Integer.MAX_VALUE);
    }

    public TreeNode deseHelper(Queue<String> queue, int min, int max) {
        if (queue.isEmpty()) return null;

        int val = Integer.parseInt(queue.peek());
        if (val < min || val > max) return null;
        queue.poll();
        TreeNode node = new TreeNode(val);
        node.left = deseHelper(queue, min, val);
        node.right = deseHelper(queue, val, max);
        return node;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值