题目

序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。

设计一个序列化和反序列化 N 叉树的算法。

序列化/反序列化算法的算法实现没有限制。你只需要保证 N 叉树可以被序列化为一个字符串并且该字符串可以被反序列化成原树结构即可。

例如,你需要序列化下面的 3-叉 树。

image.png

[1 [3[5 6] 2 4]]。你不需要以这种形式完成,你可以自己创造和实现不同的方法。

注意:

  • N 的范围在 [1, 1000]
  • 不要使用类成员/全局变量/静态变量来存储状态。你的序列化和反序列化算法应是无状态的。

    方案一(python pickle)

  1. """
  2. # Definition for a Node.
  3. class Node(object):
  4. def __init__(self, val=None, children=None):
  5. self.val = val
  6. self.children = children
  7. """
  8. import pickle
  9. class Codec:
  10. def serialize(self, root: 'Node') -> str:
  11. """Encodes a tree to a single string.
  12. :type root: Node
  13. :rtype: str
  14. """
  15. return pickle.dumps(root)
  16. def deserialize(self, data: str) -> 'Node':
  17. """Decodes your encoded data to tree.
  18. :type data: str
  19. :rtype: Node
  20. """
  21. return pickle.loads(data)
  22. # Your Codec object will be instantiated and called as such:
  23. # codec = Codec()
  24. # codec.deserialize(codec.serialize(root))
  • 性能有点差

方案二

  1. """
  2. # Definition for a Node.
  3. class Node(object):
  4. def __init__(self, val=None, children=None):
  5. self.val = val
  6. self.children = children
  7. """
  8. class Codec:
  9. def serialize(self, root: 'Node') -> str:
  10. """Encodes a tree to a single string.
  11. :type root: Node
  12. :rtype: str
  13. """
  14. if not root:
  15. return ""
  16. if not root.children:
  17. return str(root.val) + " "
  18. ret = f"{str(root.val)} [ "
  19. for child in root.children:
  20. ret += self.serialize(child)
  21. ret += " ] "
  22. return ret
  23. def deserialize(self, data: str) -> 'Node':
  24. """Decodes your encoded data to tree.
  25. :type data: str
  26. :rtype: Node
  27. """
  28. if not data:
  29. return None
  30. data = data.split()
  31. if len(data) == 1:
  32. return Node(val=int(data[0]), children=[])
  33. stack = [] # 保存未构建完成的 children
  34. children = []
  35. for token in data:
  36. if token == "[":
  37. stack.append(children)
  38. children = []
  39. elif token == "]":
  40. before_children = stack.pop()
  41. before_children[-1].children = children
  42. children = before_children
  43. else:
  44. children.append(Node(val=int(token), children=[]))
  45. return children[0]
  46. # Your Codec object will be instantiated and called as such:
  47. # codec = Codec()
  48. # codec.deserialize(codec.serialize(root))

原文

https://leetcode-cn.com/explore/learn/card/n-ary-tree/161/conclusion/627/