Description

难度困难:剑指 Offer 37. 序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”

Solution

层序遍历解决
序列化的时候,把 null 也当做节点添加到队列中,当取出从队列取出节点时,判断下节点是否为 null,为 null 时,直接打印出 null。注意:LinkedList 实现的 Queue 才允许存入 null 节点。

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