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

题目链接

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

思路

使用BFS的方法进行序列化及反序列化

序列化

运用BFS遍历树的所有结点,不论是否为null都放进队列中。

  • 如果结点不为 null,则把结点数据转为字符串放入结果字符串中。
  • 如果结点为 null,则把 "X" 放入结果字符串中。

所有结点都以 "," 作为分隔。

注意:此处队列需要使用能存放 null 值的数据结构进行实例化。

反序列化

与序列化相似,建立新结点 root,将 root 放入队列,循环中每次取队头结点 node,依据序列字符串不断地修改 node.leftnode.right

  • 如果字符串为 "X" 则跳过修改对应的 node.leftnode.right
  • 如果字符串不为 "X" 则将新结点建立。

注意: while 循环中要修改 node 的成员,而不要修改 node 本身,因为 root 初值为 null,这样在取队头结点的时候是传的值而不是引用。对 node 的修改没法传到 root

代码

class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null){
            return "";
        }

        StringBuilder sb = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();

        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();

            if(node == null){
                sb.append("X,");
            }else{
                sb.append(node.val + ",");
                queue.offer(node.left);
                queue.offer(node.right);
            }
        }

        return sb.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(Objects.equals(data, "")){
            return null;
        }

        Queue<String> nodes = new ArrayDeque<>(Arrays.asList(data.split(",")));
        TreeNode root = new TreeNode(Integer.parseInt(nodes.poll()));
        Queue<TreeNode> queue = new ArrayDeque<>();

        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            String left = nodes.poll();
            String right = nodes.poll();

            if(!left.equals("X")){
                node.left = new TreeNode(Integer.parseInt(left));
                queue.add(node.left);
            }
            if(!right.equals("X")){
                node.right = new TreeNode(Integer.parseInt(right));
                queue.add(node.right);
            }
        }

        return root;
    }
}
posted @   Frodo1124  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示