剑指 offer 37 序列化二叉树(层序遍历BFS)

1 题目描述

2 算法思路

2.1 序列化 

序列化思路:

  • 序列化,其实就是层序遍历,为了能够完整的体现序列化二叉树的信息,这里选择将所以叶子节点的null 节点都输出,因此会比题目中的null 要多,例如 4 和5 的null 值都会出现,但是这个并不影响

序列化算法:

  1. 特值:当root为空时,直接返回空列表
  2. 初始化:队列queue, 包含root
  3. 层序遍历:当queue为空时,就跳出
    1. 节点出队,记作node
    2. 如果节点不为空,就打印,并将左右子节点加入queue
    3. 如果为空,就打印“null”
  4. 返回值,拼接列表

2.2 反序列化

算法流程:

  1. 特值:当data为空时,直接返回null;
  2. 初始化:序列化列表 vals,去掉首尾的括号,以逗号分隔,队列queue,添加root
  3. 按层构建,当queue为空时跳出
    1. 将root节点入队,记为node
    2. 构建node的左子节点,node.left 值为 val[i] 并将node.left 入队 ,i++
    3. 构建node的右子节点,node.right 值为 val[i] ,并将node.right 入队, i++
  4. 返回root

3 代码

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null)
            return "[]";
        Queue<TreeNode> queue = new LinkedList<>();
        StringBuilder res = new StringBuilder("[");
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(node != null){
                res.append(node.val + ",");
                queue.add(node.left);
                queue.add(node.right);
            }
            else{
                res.append("null,");
            }
        }
        res.deleteCharAt(res.length() - 1); //删除最后一个逗号
        res.append("]");
        return res.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.equals("[]"))   //字符串为空
            return null;
        String[] vals =  data.substring(1,data.length() - 1).split(",");  //将data去掉头尾括号后,按照逗号分隔
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        queue.add(root);
        int i = 1;
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(!vals[i].equals("null")){    //当序列化字符串此时不为null
                node.left = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.left);
            }
            i++;
            if(!vals[i].equals("null")){
                node.right = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.right);
            }
            i++;
        }
        return root;
    }
}

 

4 提交结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值