序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree
package aboutTree; import java.util.LinkedList; import java.util.Queue; public class Codec { public static void main(String[] args) { // TODO Auto-generated method stub TreeNode root = new TreeNode(1); root.left=new TreeNode(2); TreeNode node = new TreeNode(3); root.right=node; node.left=new TreeNode(4); node.right=new TreeNode(5); String serialize = serialize(root); System.out.println(serialize); show(new Codec().deserialize(serialize)); //show(root); } public static void show(TreeNode root) { if(root!=null) { System.out.println(root.val); show(root.left); show(root.right); } } // Encodes a tree to a single string. public static String serialize(TreeNode root) { //树的层次遍历-->BFS Queue<TreeNode> queue = new LinkedList<>(); StringBuffer sf = new StringBuffer("["); queue.add(root); //根节点入队 while(!queue.isEmpty()) { TreeNode cur = queue.remove(); if(cur ==null) { sf.append(null+","); } else { sf.append(cur.val+","); queue.add(cur.left); queue.add(cur.right); } } sf.setLength(sf.length()-1); sf.append("]"); return sf.toString(); } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { String [] nodes =data.substring(1, data.length()-1).split(","); TreeNode root =getNode(nodes[0]); Queue<TreeNode> parents = new LinkedList<>(); TreeNode parent = root; boolean isLeft = true; for(int i=1;i<nodes.length;i++) { TreeNode cur =getNode(nodes[i]); if(isLeft) { parent.left=cur; } else { parent.right=cur; } if(cur!=null) { parents.add(cur); } isLeft =!isLeft; if(isLeft) { parent =parents.peek(); parents.poll(); } } return root; } public TreeNode getNode(String val) { if(val.equals("null")) { return null; } return new TreeNode(Integer.valueOf(val)); } }