LeetCode——剑指 Offer 37. 序列化二叉树

剑指 Offer 37. 序列化二叉树

题目

题解思路

1>源代码

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        if not root:
            return []
        queue = []
        data = []
        queue.append(root)
        while queue:
            temp_node = queue.pop(0)
            if temp_node==None:
                data.append(null)
                continue
            data.append(temp_node.val)
            queue.append(temp_node.left)
            queue.append(temp_node.right)
        return data
        

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if len(data) == 0:
            return None
        root = TreeNode(data[0])
        queue = [root]
        index = 1
        while queue:
            temp_node = queue.pop(0)
            if data[index]!=null:
                temp_node.left = TreeNode(int(data[index]))
                queue.append(temp_node.left)
            index += 1
            if data[index]!=null:
                temp_node.right = TreeNode(int(data[index]))
                queue.append(temp_node.right)
            index += 1
        return root


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

2>算法介绍

本题虽然是一道困难难度的题,但其实在算法课和数据结构课上很早就接触过,无非是层次遍历的实现和二叉树的反序列化,这两个步骤都需要借助队列来完成。

层次遍历的实现已经遇到过很多次了,在这里就不赘述,这里我们重点考虑一下反序列化的过程。

在遍历data数组时,我们维护一个队列。由于层次遍历是依照先左子树后右子树的顺序,所以我们在构造树的时候也采取如上顺序。这里需要注意的是如果遍历到’null’元素时,我们应不采取任何操作并将data数组的index加一,理由是每一个节点的左右孩子指针在初始化时就已经是None了,而且None也不存在左右孩子,也就意味着本次"子构造"到此为止了,树的深度不会继续增加。

经验分享 程序员 微信小程序 职场和发展