Leetcode 765 Solution

This article provides solution to leetcode question 765 (serialize-and-deserialize-n-ary-tree).

https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree

Solution

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Codec:
    def serialize(self, root: 'Node') -> str:
        """Encodes a tree to a single string.
        
        :type root: Node
        :rtype: str
        """
        if not root:
            return ""
        
        ans = []
        def _serialize(node):
            if not node:
                return
            
            ans.append(str(node.val))
            
            if node.children:
                ans.append('[')
                for child in node.children:
                    _serialize(child)
                ans.append(']')
        
        _serialize(root)
        
        return " ".join(ans)

    def deserialize(self, data: str) -> 'Node':
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: Node
        """
        if not data:
            return None

        tokens = data.split(' ')
        
        if not tokens:
            return None

        i = 0
        def _deserialize(layer = 0):
            nonlocal i

            v = int(tokens[i])
            i += 1
            
            node = Node()
            node.val = v
            node.children = []

            if i == len(tokens) or tokens[i].isnumeric() or tokens[i] == ']':
                return node
            
            assert tokens[i] == '[', "Token is {}".format(tokens[i])

            i += 1
            while i < len(tokens) and tokens[i] != ']':
                node.children.append(_deserialize(layer + 1))
            i += 1

            return node
        
        return _deserialize()

# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))