刷题笔记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;
    }
}
相关推荐
算AI4 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程5554 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
owde5 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头5 小时前
分享宝藏之List转Markdown
数据结构·list
hyshhhh6 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
蒙奇D索大6 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西6 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
杉之6 小时前
选择排序笔记
java·算法·排序算法
吴梓穆7 小时前
UE5学习笔记 FPS游戏制作38 继承标准UI
笔记·学习·ue5
烂蜻蜓7 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法