刷题笔记21——二叉树序列化和反序列化

兴高采烈地迎接每一场空欢喜,是我最年少的事。------哈德门

小结

  • String.valueOf()
  • Integer.parseInt()

两种序列化的方式(递归/BFS)

652. 寻找重复的子树(最重要的是找到一个序列化方式,将一棵树表示出来)

java 复制代码
class Solution {
    Map<String,Integer> res = new HashMap<String,Integer>();
    List<TreeNode> result = new LinkedList<TreeNode>();
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        findSeq(root);
        return result;
    }

    public String findSeq(TreeNode root){
        if(root==null) return "";
        StringBuilder sb = new StringBuilder();
        sb.append(String.valueOf(root.val));
        sb.append("(");
        sb.append(findSeq(root.left));
        sb.append(")(");
        sb.append(findSeq(root.right));
        sb.append(")");
        String s = sb.toString();
        res.put(s,res.getOrDefault(s,0)+1);
        // 这里必须先put值再进行get取值
        if(res.get(s)==2){
            result.add(root);
        }
        return s;
    }
}

297. 二叉树的序列化与反序列化(华为面试考过)

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        if(root==null) return "";
        q.offer(root);
        StringBuilder sb = new StringBuilder();

        while(!q.isEmpty()){
            int sz = q.size();
            for(int i=0;i<sz;i++){
                TreeNode temp = q.poll();
                if(temp==null){
                    sb.append("X,") ; 
                }else{
                    sb.append(temp.val + ",");
                    q.offer(temp.left);
                    q.offer(temp.right);
                }  
            }
        }
        return sb.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data=="") return null;
        Queue<String> nodes = new ArrayDeque<>(Arrays.asList(data.split(",")));
        TreeNode root = new TreeNode(Integer.parseInt(nodes.poll()));
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);

        while(!q.isEmpty()){
            int sz = q.size();
            for(int i=0;i<sz;i++){
                TreeNode temp = q.poll();
                if(temp!=null){
                    String left = nodes.poll();
                    String right = nodes.poll();
                    if(!left.equals("X")){
                        temp.left = new TreeNode(Integer.parseInt(left));
                        q.offer(temp.left);
                    }
                    if(!right.equals("X")){
                        temp.right = new TreeNode(Integer.parseInt(right));
                        q.offer(temp.right);
                    }   
                } 
            }
        }
        return root;
    }
}
相关推荐
CoovallyAIHub5 小时前
CVPR 2025 | 频率动态卷积(FDConv):以固定参数预算实现频率域自适应,显著提升视觉任务性能
深度学习·算法·计算机视觉
mit6.8245 小时前
[rStar] 解决方案节点 | `BaseNode` | `MCTSNode`
人工智能·python·算法
Hóng xīng qiáo5 小时前
swVBA自学笔记014、Lisp适合对SolidWorks进行二次开发吗 ?
开发语言·笔记·lisp
on_pluto_5 小时前
Leecode hot100 - 448. 找到所有数组中消失的数字
数据结构
Magnetic_h6 小时前
【iOS】block复习
笔记·macos·ios·objective-c·cocoa
zl_dfq6 小时前
数据结构 之 【布隆过滤器 的简介】
数据结构
晴空闲雲6 小时前
数据结构与算法-树和二叉树-二叉树的存储结构(Binary Tree)
数据结构·算法
带娃的IT创业者6 小时前
《AI大模型应知应会100篇》第68篇:移动应用中的大模型功能开发 —— 用 React Native 打造你的语音笔记摘要 App
人工智能·笔记·react native
索迪迈科技7 小时前
Flink Task线程处理模型:Mailbox
java·大数据·开发语言·数据结构·算法·flink
元亓亓亓8 小时前
LeetCode热题100--230. 二叉搜索树中第 K 小的元素--中等
算法·leetcode·职场和发展