LeetCode Hot 100 No.297 二叉树的序列化与反序列化

在这里插入图片描述
在这里插入图片描述

思路:
示例1所示的二叉树如果用leetcode的标准转换为字符串后,应为[,1,2,3,null,null,4,5,null,null] ,题目中写的其实是省去了开头的逗号和最后两个null的。[,1,2,3,null,null,4,5,null,null] 其实就是二叉树的层序遍历的结果,而且结果中要保存null。
我们可以很容易通过队列写出二叉树的层序遍历的结果,保存在字符串中作为序列化的结果输出:

public String serialize(TreeNode root) {
        StringBuffer sb = new StringBuffer();
        if(root==null)
        {return sb.toString();}
        Deque<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty())
        {
            TreeNode top = que.poll();
            if(top==null)
            {
                sb.append(",null");
                continue;
            }
            else
            {
                sb.append(","+top.val);
                que.offer(top.left);
                que.offer(top.right);
            }
        }
        return sb.toString();
    }

下面我们来看从字符串生成一个二叉树:
[,1,2,3,null,null,4,5,null,null]
我们把这个字符串按照逗号分割,生成一个字符串数组
["",“1”,“2”,”3“,”null“,“null”,”4“,”5“,”null“,”null“] 注意第0个元素是一个空字符串。
其实也是二叉树的层序遍历,首先我们生成根节点1,将根节点加入队列。
进入循环,设一个指针i,一开始指向第2位(从0开始),也就是2节点。
首先将队首元素出队,然后生成指针i 和 指针i+1位置处的2,3节点,将2,3节点连接到刚刚出队的节点上,再将2,3节点入队。然后将指针加2。继续循环。
将队首元素出队,此时指针指向第4位,也就是”null“节点。将指针i 和 指针i+1位置处的null节点连接到刚刚出队的队首元素上。然后将两个null 入队。将指针加2,继续循环。

重复上述操作,直到指针i>字符串数组长度为止。
返回根节点。

public TreeNode deserialize(String data) {
        String[] dt = data.split(",");
        if(dt.length<2)
            return null;
        Deque<TreeNode> que = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(dt[1]));
        que.offer(root);
        int i=2;
        while(i<dt.length)
        {
            TreeNode top = que.poll();
            if(top == null)
                continue;
            if(dt[i].equals("null"))
                top.left=null;
            else
                top.left=new TreeNode(Integer.parseInt(dt[i]));
            que.offer(top.left);
            if(dt[i+1].equals("null"))
                top.right=null;
            else
                top.right=new TreeNode(Integer.parseInt(dt[i+1]));
            que.offer(top.right);
            i += 2;
        }
        return root;   
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值