vlambda博客
学习文章列表

剑指 Offer 37. 序列化二叉树

题目:

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

序列化为 "[1,2,3,null,null,4,5]"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof

解题:

关键点:树的层次遍历

 
   
   
 
  1. /**

  2. * 序列化,反序列化树

  3. * 序列化,树转为数组

  4. * 反序列化,数组转为树

  5. * 关键点:树的层次遍历

  6. * 特别注意的一点: 最后一排的子节点的null 也要全部输入哦

  7. * [1,2,3,4,5,null,6,null,null,7,8,null,null,null,null,null,null]

  8. */

  9. public class SerializeTree {


  10. public static void main(String[] args) {

  11. String result = serialize(TreeNode.getTreeRoot());

  12. System.out.println(result);

  13. TreeNode root = deserialize(result);

  14. traverse_level(root);

  15. }


  16. public static void traverse_level(TreeNode root) {

  17. if (root == null) {

  18. System.out.println("当前树是空的!");

  19. }

  20. LinkedList<TreeNode> queue = new LinkedList<>();

  21. queue.add(root);

  22. while (!queue.isEmpty()) {

  23. TreeNode node = queue.poll();

  24. if (node != null) {

  25. System.out.print(node.val + " ");

  26. }

  27. if (node.left != null) {

  28. queue.offer(node.left);

  29. }

  30. if (node.right != null) {

  31. queue.offer(node.right);

  32. }

  33. }

  34. }


  35. // Encodes a tree to a single string.

  36. public static String serialize(TreeNode root) {

  37. if (root == null) {

  38. return "[]";

  39. }

  40. StringBuilder result = new StringBuilder("[");

  41. LinkedList<TreeNode> queue = new LinkedList<>();

  42. queue.offer(root);


  43. while (!queue.isEmpty()) {

  44. TreeNode node = queue.poll();

  45. if (node != null) {

  46. result.append(node.val).append(",");

  47. queue.offer(node.left);

  48. queue.offer(node.right);

  49. } else {

  50. result.append("null").append(",");

  51. }

  52. }

  53. result.deleteCharAt(result.length() - 1);

  54. return result.append("]").toString();

  55. }


  56. // Decodes your encoded data to tree.

  57. // 这里去构建树的时候,一定要注意的是,遍历的是数组,通过数组的下标和树的层次遍历来进行构建;

  58. // 当数组中的元素值 不是null的时候 说明当前节点还有左儿子或者右儿子,应该把儿子放入queue里面;

  59. // 当数组中的元素值 是null的时候 说明当前节点没有了左儿子或者右儿子,不需要进行构建了无需放入到queue里面;

  60. public static TreeNode deserialize(String data) {

  61. if ("[]".equals(data)) {

  62. return null;

  63. }

  64. String[] vals = data.substring(1, data.length() - 1).split(",");

  65. TreeNode root = new TreeNode(Integer.valueOf(vals[0]));


  66. int i = 1;

  67. LinkedList<TreeNode> queue = new LinkedList<>();

  68. queue.add(root);

  69. while (!queue.isEmpty()) {

  70. TreeNode node = queue.poll();

  71. if (!vals[i].equals("null")) { // 如果元素不为空,构建左节点 并放入queue;

  72. node.left = new TreeNode(Integer.valueOf(vals[i]));

  73. queue.offer(node.left);

  74. }

  75. i ++;

  76. if (!vals[i].equals("null")) {// 如果元素不为空,构建右节点 并放入queue;

  77. node.right = new TreeNode(Integer.valueOf(vals[i]));

  78. queue.offer(node.right);

  79. }

  80. i ++;

  81. }


  82. return root;

  83. }

  84. }