刷题笔记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;
    }
}
相关推荐
yuxb733 分钟前
Linux 文本处理与 Shell 编程笔记:正则表达式、sed、awk 与变量脚本
linux·笔记·正则表达式
野渡拾光1 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
tainshuai3 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
饕餮争锋3 小时前
设计模式笔记_行为型_访问者模式
笔记·设计模式·访问者模式
不羁。。5 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao3410 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
好望角雾眠10 小时前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
zhangfeng113310 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类