首页 > 其他分享 >LCR 048. 二叉树的序列化与反序列化(困难)(主站297)

LCR 048. 二叉树的序列化与反序列化(困难)(主站297)

时间:2024-12-10 10:58:15浏览次数:6  
标签:node return 主站 lst que 二叉树 TreeNode 序列化 root

https://leetcode.cn/problems/h54YBf/
https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/
难度:☆☆☆

题目:

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例:

在这里插入图片描述
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

代码1:BFS

Python

from collections import deque

class Codec:

    def serialize(self, root):
        if not root:
            return ''
        que = deque([root])
        ans = []
        while que:
            node = que.popleft()
            if node:
                ans.append(str(node.val))
                que.append(node.left)
                que.append(node.right)
            else:
                ans.append('None')
        return ','.join(ans)
        

    def deserialize(self, data):
        if not data:
            return []
        lst = data.split(',')
        root = TreeNode(int(lst[0]))
        que = deque([root])
        i = 1  # 将root放入que,i默认为1,从1开始
        while que:
            node = que.popleft()
            # 默认1,就是left
            if lst[i] != 'None':
                node.left = TreeNode(int(lst[i]))
                que.append(node.left)
            i += 1  # 不管是不是None,继续往下走
            if lst[i] != 'None':
                node.right = TreeNode(int(lst[i]))
                que.append(node.right)
            i += 1
        return root

Java

public class Codec {

    public String serialize(TreeNode root) {
        if (root == null) {
            return "";
        }
        StringBuilder ans = new StringBuilder();
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty()) {
            TreeNode node = que.poll();
            if (node != null) {
                ans.append("" + node.val);
                que.offer(node.left);
                que.offer(node.right);
            } else {
                ans.append("null");
            }
            ans.append(",");
        }
        return ans.toString();
    }

    public TreeNode deserialize(String data) {
        if (data == "") {
            return null;
        }
        String[] lst = data.split(",");
        TreeNode root = new TreeNode(Integer.parseInt(lst[0]));
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int i = 1;
        while (!que.isEmpty()) {
            TreeNode node = que.poll();
            if (!"null".equals(lst[i])) {
                node.left = new TreeNode(Integer.parseInt(lst[i]));
                que.offer(node.left);
            }
            i++;
            if (!"null".equals(lst[i])) {
                node.right = new TreeNode(Integer.parseInt(lst[i]));
                que.offer(node.right);
            }
            i++;
        }
        return root;
    }
}

代码2:DFS

Python

class Codec:

    def serialize(self, root):
        if not root:
            return 'None'
        root.left = self.serialize(root.left)
        root.right = self.serialize(root.right)
        return str(root.val) + ',' + str(root.left) + ',' + str(root.right)
        

    def deserialize(self, data):
        def dfs(lst):
            val = lst.pop(0)
            if val == 'None':
                return
            root = TreeNode(int(val))
            root.left = dfs(lst)
            root.right = dfs(lst)
            return root
        dlst = data.split(',')
        return dfs(dlst)

Java

public class Codec {

    public String serialize(TreeNode root) {
        if (root == null) {
            return "null";
        }
        String left = serialize(root.left);
        String right = serialize(root.right);
        return root.val + "," + left + "," + right;
    }

    public TreeNode deserialize(String data) {
        Queue<String> que = new LinkedList<>();
        for (String val : data.split(",")) {
            que.offer(val);
        }
        return dfs(que);
    }

    private TreeNode dfs(Queue<String> que) {
        String val = que.poll();
        if ("null".equals(val)) {
            return null;
        }
        TreeNode root = new TreeNode(Integer.parseInt(val));
        root.left = dfs(que);
        root.right = dfs(que);
        return root;
    }
}

标签:node,return,主站,lst,que,二叉树,TreeNode,序列化,root
From: https://blog.csdn.net/weixin_43606146/article/details/144339927

相关文章

  • Vue3 序列化与反序列化问题
    Vue3序列化与反序列化问题详解在现代前端开发中,数据的序列化与反序列化是一个常见且重要的任务。无论是在数据存储、网络传输,还是在本地缓存中,正确地处理数据的序列化与反序列化都是确保应用稳定性和性能的关键。对于使用Vue3框架的开发者而言,理解和掌握序列化与反序列......
  • PAT 2024年春季 甲级 A-3 Degree of Skewness(二叉树的构建)
     给出后序和中序遍历序列,求出只有左子树和只有右子树的结点之差1#include<bits/stdc++.h>2usingnamespacestd;3intn;4intnl=0,nr=0;5structnode{6intdata,lchild=-1,rchild=-1;7};8vector<node>nodes(1005);9vector<int>in_o......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • 114. 二叉树展开为链表
    问题描述给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。分析注意,这里应该使用同样的TreeNode,也就是评判时,直接看原......
  • LCR 047. 二叉树剪枝(中等)(主站814)
    https://leetcode.cn/problems/pOCWxh/https://leetcode.cn/problems/binary-tree-pruning/难度:☆☆☆题目:给定一个二叉树根节点root,树的每个节点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。节点node的子树为node本身,以及所有node的后......
  • 二叉树的C++实现
    文章目录一、二叉树存储的物理结构1.1二叉树基础知识1.2二叉树的存储1.2.1单个节点的存储:1.2.2二叉树的存储二、C++代码实现2.1每个二叉树节点结构体:2.2二叉树类的定义2.3方法实现一、二叉树存储的物理结构1.1二叉树基础知识(1)二叉树的定义:每个节点最多......
  • 二叉树遍历
    前序顺序为根左右递归publicstaticvoidpreLoop(TreeNoderoot){System.out.println(root.value);if(root.left!=null){preLoop(root.left);}if(root.right!=null){preLoop(root.right);}}其他使用栈,以根右左的顺......
  • 【Leetcode Top 100】94. 二叉树的中序遍历
    问题背景给定一个二叉树的根节点rootrootroot,返回它的中序遍历。数据约......
  • 199.二叉树的右视图
    /***@param{TreeNode}root*@return{number[]}*/varrightSideView=function(root){if(!root)return[];letdethMap=newMap();//Map夺储,key是当国节点的高度,value是我们当前节点的信;letqueue=[[root,0]];while(queue.length){//取出......
  • c语言实现二叉树的创建、遍历(先序、中序、后序)
    二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树在计算机科学中具有广泛的应用,如表达式解析、数据存储与检索等。以下是有关二叉树的基本知识。1.二叉树的基本定义节点:二叉树的基本组成单元,包括节点值和指向其子节点的指针(左指......