package treeAndRecursion.code297;import treeAndRecursion.TreeNode;import java.util.ArrayList;import java.util.List;/** * 1 * / \ * 2 3 * / \ * 4 5 * * 面对这样一棵树,序列化的时候,因为使用先序遍历无法确定树的结构,因为不知道一个分支在哪停止了 * 所以只需要遍历一个分支的时候,把下面的null也存起来,就可以清楚的知道哪一个分支在哪停止了 * 所以上面的树的先序遍历可以使用 1,2,null,null,3,4,null,null,5,null,null */public class Codec { // Encodes a tree to a single string. public String serialize(TreeNode root) { List<String> res = new ArrayList<>(); bfs(root,res); return String.join(",",res); } //先序遍历,遇到空的时候存一下空然后再返回 //先序: 根 左 右 public void bfs(TreeNode node, List<String> res){ if(node == null){ res.add("null"); return; } res.add(String.valueOf(node.val)); bfs(node.left,res); bfs(node.right,res); } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { dataArr = data.split(","); //从下标0开始走 cur = 0; return restore(); } //定义两个共享变量去辅助还原方法 //1:当前的序列化结果,用,分割成数组 private String[] dataArr; //2:当前走到了哪一个下标了 private Integer cur; public TreeNode restore(){ //递归结束条件,如果走到了null,说明当前分支结束了,再走一步,然后返回null if(dataArr[cur].equals("null")){ //只要cur用过了,就要再走一步++ cur++; return null; } //产生当前这一递归层的根节点 TreeNode root = new TreeNode(Integer.parseInt(dataArr[cur])); //只要cur用过了,就要再走一步++ cur++; //递归复原当前这一层的左右子树 root.left = restore(); root.right = restore(); return root; }}