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

你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

 

示例:

输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

 

注意:本题与主站 297 题相同:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

Related Topics
  • 深度优先搜索
  • 广度优先搜索
  • 设计
  • 字符串
  • 二叉树

  • 👍 277
  • 👎 0
  • Java层序遍历【联动 1028. 从先序遍历还原二叉树】

    就我们在力扣上做二叉树相关的题目的时候,例子说明中常用到的[1,2,3,null,null,4,5]这种写法,
    两边方括号可以直接省略,
    序列化

    1. 按层遍历,用逗号分割
    2. 空节点用自定义字符串表示
    3. 先广度优先搜索序列化成字符串,如果当前节点是空节点,用自定义字符串表示,且不再加入遍历用到的Queue
    4. 最后记得删掉多加的一个逗号

    反序列化

    1. 依旧类似广度优先搜索
    2. 字符串按照逗号分割得到每个节点的信息
    3. 从头结点开始往下拼装,用一个Queue保存上一层的节点内容
    4. 因为会遇到空节点,Queue中需要拼接上去的上层节点的时候需要先从Queue中找到最先的那个不是空节点的节点
    5. 先拼左子节点再拼右子节点,因为右子节点可能没有,所以需要额外判断下字符串分割得到的数组越界的情况

    其他方案

    1. 当然也可以选择中序遍历+前序遍历 或者中序遍历+后序遍历这样的处理办法,但是序列化获得的字符串相应的应该会变大
    2. 或者也可以直接参考【1028】从先序遍历还原二叉树 这题的方法,自行再写个序列化字符串的方法来完成本题
    3. 也许你可以直接看下力扣官方的一个功能Playground ,对,就是顶上那个小铃铛图标左边那个光标带加号里的代码
    本题层序遍历代码
    public class Codec {
        
        private String NULL = "N";
    
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            if(root == null){
                return "";
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            StringBuffer sb = new StringBuffer();
            while (!queue.isEmpty()){
                TreeNode node = queue.poll();
                sb.append(node == null?NULL:node.val).append(",");
                if (node != null){
                    queue.offer(node.left);
                }
                if (node != null){
                    queue.offer(node.right);
                }
            }
            sb.delete(sb.length()-1,sb.length());
            return sb.toString();
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if (data.length()==0){
                return null;
            }
            String[] arr = data.split(",");
            TreeNode root = new TreeNode(Integer.parseInt(arr[0]));
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            int idx = 0;
            while (++idx < arr.length){
                while (!queue.isEmpty() && queue.peek()==null){
                    queue.poll();
                }
                TreeNode curr = queue.poll();
                TreeNode left = arr[idx].equals(NULL)?null:new TreeNode(Integer.parseInt(arr[idx]));
                queue.offer(left);
                curr.left = left;
                if (idx+1 < arr.length){
                    idx++;
                    TreeNode right = arr[idx].equals(NULL)?null:new TreeNode(Integer.parseInt(arr[idx]));
                    curr.right = right;
                    queue.offer(right);
                }
            }
    
            return root;
        }
    }