《剑指offer》JZ61序列化二叉树

    技术2026-02-17  15

    题目:

    请实现两个函数,分别用来序列化和反序列化二叉树

     

    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。  

    例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树

    解析:

    两种方法:

    ①层序遍历:本次题解

    ②先序遍历:刷二遍的时候再看:https://blog.nowcoder.net/n/c74d4a5a61534a9fa7adb2ca71a72ca6?f=comment

    代码:

    /* public class TreeNode {     int val = 0;     TreeNode left = null;     TreeNode right = null;     public TreeNode(int val) {         this.val = val;     }

    } */ import java.util.*;

    public class Solution {     String Serialize(TreeNode root) {         //利用层序遍历,将所有的数存入String中,空为#         StringBuilder str = new StringBuilder();         LinkedList<TreeNode> queue = new LinkedList<>();         if(root == null){             return null;         }         queue.add(root);         while(!queue.isEmpty()){             TreeNode node = queue.pop();             if(node != null){                 queue.add(node.left);                 queue.add(node.right);                 str.append(node.val + ",");             }else{                 str.append("#,");             }         }         if(str.length() != 0){             str.deleteCharAt(str.length() - 1);         }         return str.toString();   }     TreeNode Deserialize(String str) {         TreeNode root = null;         if(str == null || str.trim().length() == 0){             return null;         }         //将StringBuilder拆分成数组         String[] strChar = str.split(",");         //新建一个TreeNode数组         TreeNode[] nodeArr = new TreeNode[strChar.length];         //遍历strChar,非#转为TreeNode,# 为null         for(int i = 0; i < strChar.length; i++){             if(!strChar[i].equals("#"))                 nodeArr[i] = new TreeNode(Integer.valueOf(strChar[i]));         }         //还原二叉树         for(int i = 0, j = 1; i < nodeArr.length && j < nodeArr.length; i++){             if(nodeArr[i] != null){                 nodeArr[i].left = nodeArr[j++];                 nodeArr[i].right = nodeArr[j++];             }         }         return nodeArr[0];   } }

     

     

     

     

     

     

    Processed: 0.015, SQL: 9