449-Serialize and Deserialize BST

本文介绍了一种二叉搜索树的序列化和反序列化方法,通过前序遍历实现序列化,并在反序列化过程中确保二叉搜索树的性质得以保持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.


The encoded string should be as compact as possible.

Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.


问题描述

对二叉排序树进行序列化和反序列化

注意, 不要使用成员变量, 全局变量, 静态变量来保存状态。


问题分析

使用前序遍历进行序列化
在反序列化的过程中, 注意上界和下界


解法1

public class Codec {
    private static final String spliter = ",";

    // Encodes a tree to a single string.
    public String serialize(TreeNode root){
        if(root == null)    return null;

        StringBuilder sb = new StringBuilder();
        preorder(root, sb);

        return sb.toString();
    }

    private void preorder(TreeNode root, StringBuilder sb){
        if(root == null)    return;

        sb.append(root.val).append(spliter);
        preorder(root.left, sb);
        preorder(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data){
        if(data == null || data.length() == 0)  return null;

        String[] sa = data.split(spliter);
        int[] index = new int[]{0};
        return helper(sa, index, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    // construct BST from preorder order traversal;
    private TreeNode helper(String[] sa, int[] index, long min, long max){
        if(index[0] >= sa.length)   return null;

        TreeNode root = null;
        int rootValue = Integer.parseInt(sa[index[0]]);
        if(rootValue > min && rootValue < max){
            root = new TreeNode(rootValue);
            index[0]++;
            root.left = helper(sa, index, min, rootValue);
            root.right = helper(sa, index, rootValue, max);
        }

        return root;
    }
}

解法2

public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        serializeHelper(sb, root);

        return sb.toString();
    }

    private void serializeHelper(StringBuilder sb, TreeNode root) {
        if(root == null)    return;

        sb.append((char)root.val);
        serializeHelper(sb, root.left);
        serializeHelper(sb, root.right);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        Queue<Character> queue = new LinkedList();
        for(Character ch: data.toCharArray())   queue.offer(ch);

        return deserializeHelper(queue, Integer.MIN_VALUE, Integer.MAX_VALUE);
    }

    private TreeNode deserializeHelper(Queue<Character> queue, int min, int max) {
        if(queue.isEmpty() || Integer.valueOf(queue.peek()) >= max) return null;

        int val = Integer.valueOf(queue.poll());
        TreeNode root = new TreeNode(val);
        root.left = deserializeHelper(queue, min, val);
        root.right = deserializeHelper(queue, val, max);

        return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值