当前位置: 首页 > article >正文

树的序列化与反序列化

1 序列化与反序列化

二叉树的序列化与反序列化

1.1 实现思路
  1. 方式一:前序遍历
    1. 通过前序遍历方式实现二叉树的序列化
    2. 将结果存入队列中
    3. 要注意空节点也要存null
  2. 方式二:层序遍历
    1. 层序遍历也是用队列实现
    2. 注意从左到右,遇到空节点存null
1.2 代码实现
/**
 * 二叉树的序列化与反序列化
 *
 * @author wen
 */
public class SerializeAndReconstructTree {
    public static class Node {
        public int val;
        public Node left;
        public Node right;

        public Node(int val) {
            this.val = val;
        }
    }

    /**
     * 二叉树的序列化(前序遍历实现)
     *
     * @param head 头节点
     * @return 返回一个队列
     */
    public static Queue<String> preSerial(Node head) {
        Queue<String> queue = new LinkedList<>();
        pres(queue, head);
        return queue;
    }

    private static void pres(Queue<String> queue, Node head) {
        if (head == null) {
            queue.add(null);
        } else {
            queue.add(String.valueOf(head.val));
            pres(queue, head.left);
            pres(queue, head.right);
        }
    }

    /**
     * 二叉树的反序列化(前序遍历实现)
     *
     * @param preQueue 存着二叉树序列化的队列
     * @return 返回,反序列化的二叉树头节点
     */
    public static Node buildByPreQueue(Queue<String> preQueue) {
        if (preQueue == null || preQueue.isEmpty()) {
            return null;
        }
        return preBuild(preQueue);
    }

    private static Node preBuild(Queue<String> preQueue) {
        String val = preQueue.poll();
        if (val == null) {
            return null;
        }
        Node head = new Node(Integer.parseInt(val));
        head.left = preBuild(preQueue);
        head.right = preBuild(preQueue);
        return head;
    }

    /**
     * 二叉树序列化(层序遍历实现)
     *
     * @param head 二叉树头节点
     * @return 返回序列化后的队列
     */
    public static Queue<String> levelSerial(Node head) {
        Queue<String> ans = new LinkedList<>();
        if (head == null) {
            ans.add(null);
        } else {
            ans.add(String.valueOf(head.val));
            Queue<Node> help = new LinkedList<>();
            help.add(head);
            while (!help.isEmpty()) {
                Node cur = help.poll();
                if (cur.left != null) {
                    ans.add(String.valueOf(cur.left.val));
                    help.add(cur.left);
                } else {
                    ans.add(null);
                }
                if (cur.right != null) {
                    ans.add(String.valueOf(cur.right.val));
                    help.add(cur.right);
                } else {
                    ans.add(null);
                }
            }
        }
        return ans;
    }

    /**
     * 反序列化(层序遍历实现)
     *
     * @param levelQueue 序列化存入的队列
     * @return 返回,反序列化的二叉树头节点
     */
    public static Node buildByLevelQueue(Queue<String> levelQueue) {
        if (levelQueue == null || levelQueue.isEmpty()) {
            return null;
        }
        Node head = generateNode(levelQueue.poll());
        Queue<Node> queue = new LinkedList<>();
        if (head != null) {
            queue.add(head);
        }
        Node node = null;
        while (!queue.isEmpty()) {
            node = queue.poll();
            node.left = generateNode(levelQueue.poll());
            node.right = generateNode(levelQueue.poll());
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        return head;
    }

    private static Node generateNode(String val) {
        if (val == null) {
            return null;
        }
        return new Node(Integer.parseInt(val));
    }
}

http://www.kler.cn/a/146862.html

相关文章:

  • 详解Rust的数据类型和语法
  • 小试牛刀-Anchor安装和基础测试
  • 【Qt】QTreeWidget的简单使用
  • 【ACM独立出版|高校主办】第四届信号处理与通信技术国际学术会议(SPCT 2024)
  • JDK17 安装使用
  • 【ARM】MDK在debug模式下的Registers窗口包含哪些内容
  • 自建CA实战之 《0x01 Nginx 配置 https单向认证》
  • C#线程 ConcurrentQueue安全队列介绍
  • Redis-性能优化
  • 视频号小店是什么?新手入驻需要什么条件?一篇详解!
  • tp8 使用rabbitMQ(1)简单队列
  • 企业联系方式真的那么难获取吗?
  • 力扣6:N字形变化
  • 【C语法学习】28 - 字符测试函数
  • 语音识别学习笔记
  • 【云备份】数据管理模块
  • 【MyBatisPlus】通俗易懂 快速入门 详细教程
  • 代码随想录算法训练营第五十七天|739. 每日温度、496.下一个更大元素 I
  • java学习part13Object类和常用方法
  • C#中的事件(委托的发布和订阅、事件的发布和订阅、EventHandler类、Windows事件)
  • scoop bucket qq脚本分析(qq绿色安装包制作)
  • UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据
  • 蚂蚁庄园小课堂答题今日答案最新
  • 【腾讯云云上实验室】用向量数据库—实践相亲社交应用
  • 数据结构 | TOP-K问题
  • Linux安装Tesseract-OCR(操作系统CentOS)