题目描述

image.png

解题思路

BFS

https://leetcode.cn/problems/xu-lie-hua-er-cha-shu-lcof/solution/mian-shi-ti-37-xu-lie-hua-er-cha-shu-ceng-xu-bian-/
BFS的反序列化也是使用队列来模拟构造树的过程。

  1. public class Codec {
  2. // Encodes a tree to a single string.
  3. public String serialize(TreeNode root) {
  4. if (root == null) return "[]";
  5. Queue<TreeNode> queue = new LinkedList<>();
  6. queue.add(root);
  7. StringBuilder res = new StringBuilder().append("[");
  8. while (!queue.isEmpty()) {
  9. TreeNode node = queue.poll();
  10. if(node != null) {
  11. res.append(node.val + ",");
  12. queue.add(node.left);
  13. queue.add(node.right);
  14. }
  15. else res.append("null,");
  16. }
  17. res.deleteCharAt(res.length() - 1);
  18. res.append("]");
  19. return res.toString();
  20. }
  21. // Decodes your encoded data to tree.
  22. public TreeNode deserialize(String data) {
  23. if (data.equals("[]")) return null;
  24. String[] split = data.substring(1, data.length() - 1).split(",");
  25. TreeNode root = new TreeNode(Integer.parseInt(split[0]));
  26. Queue<TreeNode> queue = new LinkedList<>();
  27. queue.add(root);
  28. int i = 1;
  29. while (!queue.isEmpty()) {
  30. TreeNode node = queue.poll();
  31. if (!split[i].equals("null")) {
  32. node.left = new TreeNode(Integer.parseInt(split[i]));
  33. queue.offer(node.left);
  34. }
  35. // 为null也要+1
  36. i++;
  37. if (!split[i].equals("null")) {
  38. node.right = new TreeNode(Integer.parseInt(split[i]));
  39. queue.offer(node.right);
  40. }
  41. i++;
  42. }
  43. return root;
  44. }
  45. }

DFS

https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/solution/er-cha-shu-de-xu-lie-hua-yu-fan-xu-lie-hua-by-le-2/
DFS序列化就是先序遍历,反序列化就是分割字符串之后进行生成树,注意每次生成了一个节点都需要删除值。

  1. // Encodes a tree to a single string.
  2. public String serialize(TreeNode root) {
  3. String rserialize = rserialize(root, "");
  4. return rserialize;
  5. }
  6. public String rserialize(TreeNode root, String str) {
  7. if (root == null) {
  8. str += "null,";
  9. return str;
  10. }
  11. str += root.val + ",";
  12. str = rserialize(root.left, str);
  13. str = rserialize(root.right, str);
  14. return str;
  15. }
  16. // Decodes your encoded data to tree.
  17. public TreeNode deserialize(String data) {
  18. String[] split = data.split(",");
  19. List<String> list = new ArrayList<String>(Arrays.asList(split));
  20. return rdeserialize(list);
  21. }
  22. public TreeNode rdeserialize(List<String> dataList) {
  23. // 递归到null停止,并删除
  24. if (dataList.get(0).equals("null")) {
  25. dataList.remove(0);
  26. return null;
  27. }
  28. TreeNode node = new TreeNode(Integer.parseInt(dataList.get(0)));
  29. // 注意生成节点之后删除元素
  30. dataList.remove(0);
  31. node.left = rdeserialize(dataList);
  32. node.right = rdeserialize(dataList);
  33. return node;
  34. }