Serialize and Deserialize Binary Tree*

解法二

Serialize and Deserialize Binary Tree

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

For example, you may serialize the following tree

    1
   / \
  2   3
     / \
    4   5

as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

Solution

尽量使用按层遍历的方法去做,一层while + queue的方法,需要double check '#' , 根check 一次,left and right check 一次。这道题最容易犯的错误就是不考虑二叉树的不完全情况,很多面试官不会说出来这个前提。这道题在解题的时候,很容易进入一个误区,如果使用中序遍历,所以递归的时候使用前序遍历,便于后面的反序列化。

解法一: 递归法,前序遍历,数组可以reverse下,这样可以直接使用递归,如果使用临时变量i的方法,非常容易出错。

class Codec:

    def serialize(self, root):
        if root == None:
            return []
        result = []

        self.serializeHelper(root, result)

        return result
    def serializeHelper(self, root, result):
        if root == None:
            result.append('#')
            return
        result.append(root.val)
        self.serializeHelper(root.left, result)
        self.serializeHelper(root.right, result)

    def deserialize(self, data):
        if data == None or len(data) == 0:
            return None
        data.reverse()
        return self.deserializeHelper(data)

    def deserializeHelper(self, data):
        val = data.pop()
        if val == '#':
            return None
        root = TreeNode(val)
        root.left = self.deserializeHelper(data)
        root.right = self.deserializeHelper(data)

        return root
class Codec:

    def serialize(self, root):
        if root == None:
            return []
        result = []
        queue = collections.deque([root])
        while queue:
            node = queue.popleft()
            result.append(node.val)
            if node.val != '#':
                if node.left == None:
                    node.left = TreeNode('#')
                if node.right == None:
                    node.right = TreeNode('#')
                queue.append(node.left)
                queue.append(node.right)

        return result

    def deserialize(self, data):
        if data == None or len(data) == 0:
            return None
        i = 0
        root = TreeNode(data[i])
        queue = collections.deque([root])
        rest = []
        while queue and len(data) > i + 2 :
            node = queue.popleft()
            rest.append(node.val)

            if node.val != '#':
                if data[i + 1] != '#':
                    node.left = TreeNode(data[i + 1])
                    queue.append(node.left)
                if data[i + 2] != '#':
                    node.right = TreeNode(data[i + 2])
                    queue.append(node.right)
            i += 2
        return root

Last updated

Was this helpful?