剑指offer—37.序列化二叉树—分析及代码(Java)

剑指offer——37.序列化二叉树——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 前序遍历 + 递归
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

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

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

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

二、分析及代码

1. 前序遍历 + 递归

(1)思路

题中未限定具体的序列化方式,因此任意遍历方法(如前序遍历、中序遍历、后序遍历、逐层遍历等)均可这一目标。由于题目给出的是根结点,因此选择从根结点开始的前序遍历方式能够更方便地实现。
结合递归方法,通过记录前序遍历过程中所有结点及其空子结点的信息实现序列化;再根据序列通过前序遍历方法递归构建新树,即可实现反序列化。

(2)代码

public class Solution {
    String Serialize(TreeNode root) {
        if (root == null)
            return "";
        StringBuilder str = new StringBuilder();
        SerializeTree(root, str);
        return str.toString();
    }
    
    void SerializeTree(TreeNode root, StringBuilder str) {
        if (root == null) {
            str.append("#!");
            return;
        }
        str.append(root.val);
        str.append("!");
        SerializeTree(root.left, str);
        SerializeTree(root.right, str);
        return;
    }
    
    int i = -1;
    
    TreeNode Deserialize(String str) {
        if (str.length() == 0)
           return null;
        String[] strs = str.split("!");
        return DeserializeTree(strs);
    }
    
    TreeNode DeserializeTree(String[] strs) {
        i++;
        if (strs[i].equals("#"))
            return null;
        TreeNode root = new TreeNode(Integer.parseInt(strs[i]));
        root.left = DeserializeTree(strs);
        root.right = DeserializeTree(strs);
        return root;
    }
}

(3)结果

运行时间:28ms,占用内存:9676。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法)