美文网首页
40_序列化二叉树

40_序列化二叉树

作者: 是新来的啊强呀 | 来源:发表于2020-06-06 00:12 被阅读0次

要求:请实现两个函数,分别用来序列化和反序列化二叉树。

g

思路: 利用层次遍历BFS,借助队列
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
序列化:借助队列,对二叉树做层序遍历,并将越过叶节点的 null也打印出来。
反序列化:基于本文一开始分析的 “ node , node.left , node.right ” 在序列化列表中的位置关系,可实现反序列化。利用队列按层构建二叉树,借助一个指针 ii 指向节点 node 的左、右子节点,每构建一个 node 的左、右子节点,指针 i 就向右移动 1 位。

public class Codec {
    // Encodes a tree to a single string.
// 序列化
    public String serialize(TreeNode root) {
        // 判断边界
        if(root==null)return "[]";
        Queue<TreeNode> queue = new LinkedList<>();
        // 将root加入到队列当中
        queue.add(root);
        // 初始化一个字符串操作对象,形式如下“[”
        StringBuilder str = new StringBuilder("[");
        while(!queue.isEmpty()){
            // 取出队列中的元素
            TreeNode node = queue.poll();
            if(node!=null){ 
                // 不为空时,往“[”后面添加二叉树的值+",",层次遍历
                str.append(node.val+",");
                // 往队列中添加左子节点和右子节点
                queue.add(node.left);
                queue.add(node.right);
            }else{
                // 为空时,往“[”后添加“null,”
                str.append("null,");
            }
        }
        // 删除掉最后一个字符“,”
        str.deleteCharAt(str.length()-1);
        // “]”闭合上
        str.append("]");
        return str.toString();
    }
// 反序列化
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.equals("[]"))return null;
        // 对data字符串进行处理,转换为数组,先将收尾[]去掉,然后以及,分割成数组
        String[] str = data.substring(1,data.length()-1).split(",");
        Queue<TreeNode> queue = new LinkedList<>();
        // 将字符串转为整型,并转换为TreeNode类型
        TreeNode root = new TreeNode(Integer.parseInt(str[0]));
        queue.add(root);
        int i = 1;
        while(!queue.isEmpty()){
            // 从队列中取出一个节点
            TreeNode node = queue.poll();
            if(!str[i].equals("null")){
                // 添加左子节点到node下
                node.left = new TreeNode(Integer.parseInt(str[i]));
                queue.add(node.left);
            }
            // 字符数组往后移动一位
            i++;
            if(!str[i].equals("null")){
                // 添加左子节点到node下
                node.right = new TreeNode(Integer.parseInt(str[i]));
                queue.add(node.right);
            }
            i++;
        }
        return root;
    }
}

相关文章

  • 40_序列化二叉树

    要求:请实现两个函数,分别用来序列化和反序列化二叉树。g 思路: 利用层次遍历BFS,借助队列二叉树的序列化是指:...

  • 剑指offer刷题记录(C++版本)(之七)

    61.序列化二叉树??? 题目:请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按...

  • JZ-061-序列化二叉树

    序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是指:把一棵二叉树按照某种遍...

  • 二叉树的三种遍历方法

    二叉树的序列化 为了方便构造二叉树来验证我们的算法,这里先介绍下二叉树的序列化和反序列化。 序列化 先序遍历整颗二...

  • LeetCode:序列化二叉树

    面试题37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 序列化为 ...

  • 二叉树序列化和反序列化

    二叉树序列化和反序列化 前序 序列化和反序列化

  • 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 思路 二叉树的序列化就是采用前序遍历二叉树输出节点,再碰...

  • 面试题37:序列化二叉树

    题目 实现两个函数,分别用来序列化和反序列化二叉树 解题思路 序列化根据前序遍历的顺序序列化二叉树,从根节点开始,...

  • 剑指Offer-61 二叉树序列化

    请实现两个函数,分别用来序列化和反序列化二叉树 利用广度遍历实现二叉树的序列化和非序列化。核心思想:广度遍历

  • 剑指Offer Java版 面试题37:序列化二叉树

    题目:请实现两个函数,分别用来序列化和反序列化二叉树。可以根据前序遍历的顺序来序列化二叉树。在遍历二叉树碰到nul...

网友评论

      本文标题:40_序列化二叉树

      本文链接:https://www.haomeiwen.com/subject/jlwazhtx.html