序列化二叉树(序列化和反序列化)

雨点打透心脏的1/2处 2023-10-01 08:57 97阅读 0赞

题目内容:

watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBAb2hhbmHvvIE_size_20_color_FFFFFF_t_70_g_se_x_16

解题思路:

一,序列化

  • 所谓序列化就是将二叉树的每个结点按照层序遍历的结果输出,这里面也包含空节点,因为这棵二叉树,不一定是一颗完全二叉树
  • 分析到这里序列化就变得简单多了,唯一的难点在于将树编码为单字符串(Encodes a tree to a single string)
  • 因此我们借用于StringBuilder 的特性,可以利用append拼接八大类型的任一种类型,此时选择以字符串类型进行拼接
  • 并在队头结点不等于空的时候进行其子节点的入队列操作
  1. public String serialize(TreeNode root) {
  2. //如果根节点为空,返回null
  3. if(root == null){
  4. return "[]";
  5. }
  6. //创建一个StringBuilder的对象sb
  7. StringBuilder sb = new StringBuilder();
  8. //根绝返回结果可以知道,需要添加"["
  9. sb.append("[");
  10. Queue<TreeNode> q = new LinkedList<>();
  11. //将头结点入队列
  12. q.offer(root);
  13. while(!q.isEmpty()){
  14. TreeNode cur = q.poll();
  15. //如果此时队头的结点不为空,将其val保存到sb中,并加上","
  16. if(cur != null){
  17. //也可以是 sb.append(cur.val + ",");
  18. sb.append(cur.val).append(",");
  19. //进行其孩子结点的入队列操作
  20. q.offer(cur.left);
  21. q.offer(cur.right);
  22. }else{
  23. //如果结点为空,那么就添加"null"
  24. sb.append("null").append(",");
  25. }
  26. }
  27. //去掉最后一个","
  28. sb.deleteCharAt(sb.length() - 1);
  29. //加上"]"
  30. sb.append("]");
  31. return sb.toString();
  32. }

二,反序列化

  • 反序列化就是根据上面的序列化结果来重新创建二叉树
  • 思路还是先将序列化结果分割成字符串数组
  • 以层序遍历的顺序,去取相应的孩子结点,这个取孩子结点需要一个移动的下标来进行遍历
  1. // Decodes your encoded data to tree.
  2. public TreeNode deserialize(String data) {
  3. //如果字符串data的内容和空字符串相等,返回空
  4. if(data.equals("[]")){
  5. return null;
  6. }
  7. /*
  8. 根绝上面的序列化可以得知,0号位置一定是"[",最后一位一定是"]"
  9. 因此去掉最后一位和第一位,并且将字符串以","处分割为子字符串,以字符串数组返回
  10. */
  11. String[] s = data.substring(1,data.length() - 1).split(",");
  12. Queue<TreeNode> q = new LinkedList<>();
  13. //将字符串的第一位先定义好,并入队列
  14. TreeNode root = new TreeNode(Integer.parseInt(s[0]));
  15. q.offer(root);
  16. //后序的i从1开始
  17. int i = 1;
  18. while(!q.isEmpty()){
  19. TreeNode cur = q.poll();
  20. //如果字符串数组s中的是s[i]不为空,那么就以此字符的值定义cur.left
  21. if(!s[i].equals("null")){
  22. cur.left = new TreeNode(Integer.parseInt(s[i]));
  23. q.offer(cur.left);
  24. }
  25. i++;
  26. if(!s[i].equals("null")){
  27. cur.right = new TreeNode(Integer.parseInt(s[i]));
  28. q.offer(cur.right);
  29. }
  30. i++;
  31. }
  32. return root;
  33. }

发表评论

表情:
评论列表 (有 0 条评论,97人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列/序列

    二叉树被记录成文件的过程,为二叉树的序列化 通过文件重新建立原来的二叉树的过程,为二叉树的反序列化 设计方案并实现。 (已知结点类型为32位整型) 思路:先序遍历实现。