Codec.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**
  2. * @Projectname: LeetCode
  3. * @Filename: Codec
  4. * @Author: 杨逸
  5. * @Data:2023/8/21 19:27
  6. * @Description: 二叉树的序列化与反序列化
  7. */
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * Definition for a binary tree node.
  12. * public class TreeNode {
  13. * int val;
  14. * TreeNode left;
  15. * TreeNode right;
  16. * TreeNode(int x) { val = x; }
  17. * }
  18. */
  19. public class Codec {
  20. private static StringBuilder data = new StringBuilder("");
  21. // Encodes a tree to a single string.
  22. public String serialize(TreeNode root) {
  23. data.delete(0,data.length());
  24. encode(root,0,true);
  25. return data.toString();
  26. }
  27. // Decodes your encoded data to tree.
  28. public TreeNode deserialize(String data1) {
  29. return decode(data1);
  30. }
  31. private void encode(TreeNode root,int h,boolean isLeft){
  32. if (root == null){
  33. return;
  34. }
  35. for (int i = 0; i < h; i++) {
  36. //使用 "-" 表示当前节点的高度
  37. data.append(".");
  38. }
  39. data.append(root.val);
  40. if (!isLeft){
  41. //在右子节点后加 "!" 表示为右节点
  42. data.append("!");
  43. }
  44. //递归
  45. encode(root.left,h+1,true);
  46. encode(root.right,h+1,false);
  47. }
  48. private TreeNode decode(String data1){
  49. if (data1.equals("")){
  50. return null;
  51. }
  52. char[] chars = data1.toCharArray();
  53. Map<Integer,TreeNode> map = new HashMap<>();
  54. int index = 0;
  55. StringBuilder value = new StringBuilder();
  56. //拼接根节点的值
  57. while(index < data1.length() && chars[index] != '.'){
  58. value.append(chars[index++]);
  59. }
  60. //构建根节点
  61. TreeNode root = new TreeNode(Integer.valueOf(value.toString()));
  62. map.put(0,root);
  63. int count = 0;
  64. while(index < chars.length){
  65. count = 0;
  66. //获取节点的高度
  67. while(index < data1.length() && chars[index] == '.'){
  68. count++;
  69. index++;
  70. }
  71. //获取节点的值
  72. value.delete(0,value.length());
  73. while(index < data1.length() && chars[index] != '.' && chars[index] != '!'){
  74. value.append(chars[index++]);
  75. }
  76. //构建节点
  77. TreeNode node = new TreeNode(Integer.valueOf(value.toString()));
  78. //获取当前节点的父节点
  79. TreeNode cur_root = map.get(count - 1);
  80. //挂载当前节点,根据后一个字符是否为 "!"进行挂载
  81. if (index < data1.length() && chars[index] == '!'){
  82. //右子节点
  83. cur_root.right = node;
  84. index++;
  85. }else{
  86. //左子节点
  87. cur_root.left = node;
  88. }
  89. //将当前节点加入哈希表中
  90. map.put(count,node);
  91. }
  92. return root;
  93. }
  94. }
  95. // Your Codec object will be instantiated and called as such:
  96. // Codec ser = new Codec();
  97. // Codec deser = new Codec();
  98. // TreeNode ans = deser.deserialize(ser.serialize(root));