Java 实现二叉树序列化以及反序列化

本文介绍了如何使用前序遍历方式对二叉树进行序列化和反序列化。定义了一套序列化规则,通过递归函数将二叉树转换为以_分隔的字符串,然后详细阐述了反序列化的思路,利用队列实现从字符串还原二叉树结构。并提供了一个测试用例展示整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

抛开序列化的目的:将数据持久化存储到磁盘中,我们以字符串的方式将二叉树结构打印出来,方便我们在处理二叉树相关问题的时候进行验证。

序列化

规则定义

现我们定义一套序列化规则,如下:

  1. 采用前序遍历方式,依次保存各个结点对应的值,中间以_进行分割;
  2. 如果当前结点为null,则字符串拼接上NULL;

代码实现

   private static class Node {
        public int value;
        public Node left;
        public Node right;

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

    /**
     * 使用前序遍历方式序列化Node
     *
     * @param node
     * @return
     */
    public static String serialByPreOrder(Node node) {
        if (node == null) {
            return "NULL_";
        }
        String res = node.value + "_";
        res += serialByPreOrder(node.left);
        res += serialByPreOrder(node.right);
        return res;
    }

反序列化

即将上述序列化得到的字符串结果还原成Node结构;

思路

  1. 先对字符串按照_进行分割得到字符数组;
  2. 遍历字符数组,得到各个结点的值,依次存放到队列中【借助队列方便实现递归调用】;
  3. 从队列中依次取出值,如果为NULL,则返回null,否则构造对应的Node对象,递归处理;

代码实现

public static Node reconByPreOrderStr(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
        String[] array = str.split("_");
        Queue<String> queue = new LinkedList<>();
        for (int i = 0; i < array.length; i++) {
            queue.add(array[i]);
        }
        return reconByQueue(queue);
    }

    private static Node reconByQueue(Queue<String> queue) {
        String value = queue.poll();
        if ("NULL".equals(value)) {
            return null;
        }
        Node head = new Node(Integer.valueOf(value));
        head.left = reconByQueue(queue);
        head.right = reconByQueue(queue);
        return head;
    }

测试用例

    public static void main(String[] args) {
        Node node = new Node(1);
        node.left = new Node(2);
        node.right = new Node(3);
        node.right.left = new Node(4);
        node.right.right = new Node(5);

        String serialResult = serialByPreOrder(node);
        System.out.println("序列化结果:" + serialResult);

    }

输出结果

序列化结果:1_2_NULL_NULL_3_4_NULL_NULL_5_NULL_NULL_

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值