1. package treeAndRecursion.code297;
    2. import treeAndRecursion.TreeNode;
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. /**
    6. * 1
    7. * / \
    8. * 2 3
    9. * / \
    10. * 4 5
    11. *
    12. * 面对这样一棵树,序列化的时候,因为使用先序遍历无法确定树的结构,因为不知道一个分支在哪停止了
    13. * 所以只需要遍历一个分支的时候,把下面的null也存起来,就可以清楚的知道哪一个分支在哪停止了
    14. * 所以上面的树的先序遍历可以使用 1,2,null,null,3,4,null,null,5,null,null
    15. */
    16. public class Codec {
    17. // Encodes a tree to a single string.
    18. public String serialize(TreeNode root) {
    19. List<String> res = new ArrayList<>();
    20. bfs(root,res);
    21. return String.join(",",res);
    22. }
    23. //先序遍历,遇到空的时候存一下空然后再返回
    24. //先序: 根 左 右
    25. public void bfs(TreeNode node, List<String> res){
    26. if(node == null){
    27. res.add("null");
    28. return;
    29. }
    30. res.add(String.valueOf(node.val));
    31. bfs(node.left,res);
    32. bfs(node.right,res);
    33. }
    34. // Decodes your encoded data to tree.
    35. public TreeNode deserialize(String data) {
    36. dataArr = data.split(",");
    37. //从下标0开始走
    38. cur = 0;
    39. return restore();
    40. }
    41. //定义两个共享变量去辅助还原方法
    42. //1:当前的序列化结果,用,分割成数组
    43. private String[] dataArr;
    44. //2:当前走到了哪一个下标了
    45. private Integer cur;
    46. public TreeNode restore(){
    47. //递归结束条件,如果走到了null,说明当前分支结束了,再走一步,然后返回null
    48. if(dataArr[cur].equals("null")){
    49. //只要cur用过了,就要再走一步++
    50. cur++;
    51. return null;
    52. }
    53. //产生当前这一递归层的根节点
    54. TreeNode root = new TreeNode(Integer.parseInt(dataArr[cur]));
    55. //只要cur用过了,就要再走一步++
    56. cur++;
    57. //递归复原当前这一层的左右子树
    58. root.left = restore();
    59. root.right = restore();
    60. return root;
    61. }
    62. }