刷题笔记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;
    }
}
相关推荐
柳鲲鹏5 分钟前
内斗学概论:43、平级内斗
笔记
星夜离尘5639 分钟前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi42 分钟前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者1 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet2 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
星恒随风2 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
赤生云电竞2 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
Z21-X3 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
青少儿编程课堂4 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack5 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list