算法19:LeetCode_二叉树序列化与反序列化(层序)

Posted 街头小瘪三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法19:LeetCode_二叉树序列化与反序列化(层序)相关的知识,希望对你有一定的参考价值。

 本题为链接为https://leetcode.cn/problems/serialize-and-deserialize-binary-tree

想要搞懂本题,请先阅读我之前写的关于二叉树层序遍历文章算法8:LeetCode_二叉树的层序遍历_chen_yao_kerr的博客-CSDN博客

 

本体在可在LeetCode直接进行测试,但是需要替换变量 SEPARATOR 为 “,”. 因为这是我优化代码提取出来的一个公共的东西,写太多次怕出错.

package code03.二叉树_02;

import java.util.LinkedList;
import java.util.Queue;

/**
 * https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/
 *
 * 二叉树按层序列化 与 反序列化
 *
 */
public class Code01_SerializeAndReconstructTree

    static class TreeNode 
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x)  val = x; 
    

    public static final String SEPARATOR = ",";

    public String serialize(TreeNode root)
    
        //边界值判断
        if (root == null) 
            return "";
        

        //逐层搜集,首先收集根节点,并存入队列。印证思路第1步
        StringBuffer sb = new StringBuffer();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        sb.append(root.val);
        while (!queue.isEmpty()) 
            TreeNode node = queue.poll();
            if (node.left != null) 
                queue.add(node.left);
                sb.append(SEPARATOR).append(node.left.val);
            
            else 
                sb.append(SEPARATOR).append("null");
            

            if (node.right != null) 
                queue.add(node.right);
                sb.append(SEPARATOR).append(node.right.val);
            
            else 
                sb.append(SEPARATOR).append("null");
            
        

        return sb.toString();
    

    public TreeNode generateNode (String str)
    
        if ("null".equals(str)) 
            return null;
        
        return new TreeNode(Integer.valueOf(str));
    

    public TreeNode deserialize(String data)
    
        if (data == null || data.isEmpty()) 
            return null;
        

        Queue<String> queue = new LinkedList<>();
        String[] arr = data.split(SEPARATOR);
        for (int i = 0; i < arr.length; i++) 
            queue.add(arr[i]);
        

        Queue<TreeNode> queueNode = new LinkedList<>();
        TreeNode node = generateNode(queue.poll());
        queueNode.add(node);
        TreeNode cur = null;
        while (!queueNode.isEmpty()) 
            cur = queueNode.poll();
            if (cur != null) 
                cur.left =  generateNode(queue.poll());
                cur.right = generateNode(queue.poll());
                queueNode.add(cur.left);
                queueNode.add(cur.right);
            
        
        return node;
    

    public static void main(String[] args)
    
        TreeNode tree = new TreeNode(1);
        tree.left = new TreeNode(2);
        tree.right = new TreeNode(3);
        tree.left.left = new TreeNode(4);
        tree.right.right = new TreeNode(5);
        tree.left.left.left = new TreeNode(6);

        Code01_SerializeAndReconstructTree test = new Code01_SerializeAndReconstructTree();
        String str = test.serialize(tree);
        System.out.println(str);

        TreeNode node = test.deserialize(str);
        System.out.println("===========测试完毕,debug查看node================");
    

 

 

以上是关于算法19:LeetCode_二叉树序列化与反序列化(层序)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 297. 二叉树的序列化与反序列化(bfs,二叉树,Java)

LeetCode(算法)- 297. 二叉树的序列化与反序列化

Leetcode刷题Python297. 二叉树的序列化与反序列化

LeetCode Java刷题笔记—297. 二叉树的序列化与反序列化

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

数据结构与算法之深入解析“二叉树的序列化与反序列化”的求解思路与算法示例