ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 树的序列化和反序列化 * 序列化 将内存里的树对象,以一定的数据方式存放到磁盘上。 * 反序列化 从磁盘文件里读取数据后,解析并组装成内存里的树形对象。 ## 题目及代码 ~~~ /** * 剑指 Offer 37. 序列化二叉树 * @Author: mango * @Date: 2022/4/15 10:31 下午 */ public class LCoffer_37 { /** * Definition for a binary tree node. */ public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Codec { // 前序遍历序列化 public String serialize(TreeNode root) { return preOrderEn(root); } // 前序遍历,E为结尾符,#为空节点 private String preOrderEn(TreeNode root) { if(root == null){ return "#E"; } String result = root.val + "E"; result += preOrderEn(root.left); result += preOrderEn(root.right); return result; } // 前序遍历反序列化 public TreeNode deserialize(String data) { //1E2E#E#E3E4E#E#E5E#E#E String[] arr = data.split("E"); if(arr.length == 0){ return null; } Queue<String> queue = new LinkedList<>(); for(String str : arr){ queue.offer(str); } return preOrderDe(queue); } // 前序遍历 private TreeNode preOrderDe(Queue<String> queue) { String val = queue.poll(); // 遇到#号,则返回null if("#".equals(val)){ return null; } // 在前序的位置,组装节点 TreeNode root = new TreeNode(Integer.valueOf(val)); // 左节点 root.left = preOrderDe(queue); // 右节点 root.right = preOrderDe(queue); return root; } } } ~~~