[leetcode][java][队列]449.序列化和反序列化二叉排序树

4 篇文章 0 订阅
2 篇文章 0 订阅

将二叉排序树序列化成字符串,再将序列化后的字符串反序列成二叉排序树。

对二叉排序树序列化只能用先序访问序列化,这里用到StringBuilder,添加空格字符分离每个值;

反序列化使用到队列,当然还有递归,第一个字符肯定是根节点,比根节点小的都是左子树,比根节点大的是右子树,使用队列再次构造左子树,再用剩下的队列构造右子树。

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        helpSerialize(root,sb); 
        return sb.toString();
        
    }
    public void helpSerialize(TreeNode root, StringBuilder sb){
        if(root == null)
            return;
        sb.append(root.val).append(" ");
        helpSerialize(root.left,sb);
        helpSerialize(root.right,sb);
    }

    // Decodes your encoded data to tree.
   public TreeNode deserialize(String data) {
        if(data.length() == 0) return null;
        String[] strs = data.split(" ");
        Queue<Integer> queue = new LinkedList<>();
        //queue.addAll(Arrays.asList(data.split(" ")));
        for(String str:strs){
            queue.offer(Integer.parseInt(str));
        }
        return help(queue);
    }
    public TreeNode help(Queue<Integer> q) {
        if(q.isEmpty()) return null;
        int cur = q.poll();
        TreeNode root = new TreeNode(cur);
        Queue<Integer> sq = new LinkedList<>();
        while(!q.isEmpty() && q.peek()<cur){
            sq.offer(q.poll());
        }
        root.left = help(sq);
        root.right = help(q);
        return root;
    }
}

方法参考LeetCode讨论中的一个编友。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值