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


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

    小结

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

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

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

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    /**
     * 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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    安装JDK(不同环境下都有)
    如何使用 nvm-windows 这个工具来管理你电脑上的Node.js版本
    C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用
    Vue3 监听属性
    生成网络之Flow-based Generative Model
    springboot整合SSE
    高压放大器在制备功能材料中的应用
    Delphi 高效处理大数据量的字典数据的查询问题
    Vue 之 Toast 消息提示插件的简单封装
    【python基础】循环语句-break关键字
  • 原文地址:https://blog.csdn.net/CZY925323/article/details/132848490