设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
import java.util.LinkedList; /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * This method will be invoked first, you should design your own algorithm * to serialize a binary tree which denote by a root node to a string which * can be easily deserialized by your own "deserialize" method later. */ public String serialize(TreeNode root) { // write your code here if (root == null) { return "#"; } String str = ""; LinkedList<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode current = queue.poll(); if (current == null) { str += "#,"; } else { str = str + current.val + ","; queue.offer(current.left); queue.offer(current.right); } } while (str.charAt(str.length()-1) == '#' && str.charAt(str.length()-1) == ',') { str = str.substring(0, str.length() -3); } return str; } /** * This method will be invoked second, the argument data is what exactly * you serialized at method "serialize", that means the data is not given by * system, it's given by your own serialize method. So the format of data is * designed by yourself, and deserialize it here as you serialize it in * "serialize" method. */ public TreeNode deserialize(String data) { // write your code here String[] strs = data.split(","); if (strs.length == 0 || "#".equals(data)) { TreeNode treeNode = null; return treeNode; } TreeNode root = new TreeNode(Integer.parseInt(strs[0])); LinkedList<TreeNode> queue = new LinkedList<>(); queue.offer(root); int num = 1; while (!queue.isEmpty() && num < strs.length) { TreeNode current = queue.poll(); if ("#".equals(strs[num])) { current.left = null; num++; } else { current.left = new TreeNode(Integer.parseInt(strs[num])); queue.offer(current.left); num++; } if (num < strs.length && "#".equals(strs[num])) { current.right = null; num++; } else { current.right = new TreeNode(Integer.parseInt(strs[num])); queue.offer(current.right); num++; } } return root; } }