diff --git a/notes/37. 序列化二叉树.md b/notes/37. 序列化二叉树.md index 2a4562b5..68ba5457 100644 --- a/notes/37. 序列化二叉树.md +++ b/notes/37. 序列化二叉树.md @@ -8,37 +8,57 @@ ## 解题思路 +用前序遍历序列化,空节点写成 #,值之间用空格分隔。例如根为 1、左孩子为 2、右孩子 3 下面有 4 和 5 的树,序列化为: + +```text +1 2 # # 3 4 # # 5 # # +``` + +

+ +反序列化按同样的前序顺序读取:读到 # 返回 null,否则创建节点,再依次递归构建左子树和右子树。# 标出了每棵子树在哪里结束,因此只用前序序列就能还原出唯一的树;不记录空节点时,需要前序和中序两个序列(见 [7. 重建二叉树](7.%20重建二叉树.md))。 + +序列化时所有节点追加到同一个 StringBuilder 中,时间复杂度为 O(N)。如果每层递归都返回字符串再拼接,子树的结果会被反复复制,树退化成链时为 O(N2)。 + ```java class Codec { - private String deserializeStr; + private String[] tokens; + private int index; // Encodes a tree to a single string. public String serialize(TreeNode root) { - if (root == null) { - return "#"; + StringBuilder sb = new StringBuilder(); + serialize(root, sb); + return sb.toString(); + } + + private void serialize(TreeNode root, StringBuilder sb) { + if (sb.length() > 0) { + sb.append(' '); } - return root.val + " " + serialize(root.left) + " " + serialize(root.right); + if (root == null) { + sb.append('#'); + return; + } + sb.append(root.val); + serialize(root.left, sb); + serialize(root.right, sb); } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { - deserializeStr = data; + tokens = data.split(" "); + index = 0; return deserialize(); } private TreeNode deserialize() { - if (deserializeStr.length() == 0) { - return null; - } - int index = deserializeStr.indexOf(" "); - String node = index == -1 ? deserializeStr : deserializeStr.substring(0, index); - deserializeStr = index == -1 ? "" : deserializeStr.substring(index + 1); + String node = tokens[index++]; if (node.equals("#")) { return null; } - int val = Integer.parseInt(node); - TreeNode t = new TreeNode(val); + TreeNode t = new TreeNode(Integer.parseInt(node)); t.left = deserialize(); t.right = deserialize(); return t; diff --git a/notes/pics/offer37-serialize-tree.png b/notes/pics/offer37-serialize-tree.png new file mode 100644 index 00000000..ac009ad4 Binary files /dev/null and b/notes/pics/offer37-serialize-tree.png differ