树的序列化与反序列化

1 序列化与反序列化

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

1.1 实现思路
  1. 方式一:前序遍历
    1. 通过前序遍历方式实现二叉树的序列化
    2. 将结果存入队列中
    3. 要注意空节点也要存null
  2. 方式二:层序遍历
    1. 层序遍历也是用队列实现
    2. 注意从左到右,遇到空节点存null
1.2 代码实现
java 复制代码
/**
 * 二叉树的序列化与反序列化
 *
 * @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));
    }
}
相关推荐
胡桃姓胡,蝴蝶也姓胡4 小时前
Rag优化 - 如何提升首字响应速度
后端·大模型·rag
紫荆鱼8 小时前
设计模式-命令模式(Command)
c++·后端·设计模式·命令模式
编码追梦人8 小时前
深耕 Rust:核心技术解析、生态实践与高性能开发指南
开发语言·后端·rust
朝新_9 小时前
【SpringBoot】详解Maven的操作与配置
java·spring boot·笔记·后端·spring·maven·javaee
绝无仅有9 小时前
某教育大厂面试题解析:MySQL索引、Redis缓存、Dubbo负载均衡等
vue.js·后端·面试
sean9 小时前
开发一个自己的 claude code
前端·后端·ai编程
追逐时光者10 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 59 期(2025年10.20-10.26)
后端·.net
盖世英雄酱5813611 小时前
java深度调试【第三章内存分析和堆内存设置】
java·后端
007php00711 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
程序定小飞11 小时前
基于springboot的电影评论网站系统设计与实现
java·spring boot·后端