《剑指Offer》刷题笔记——面试题37. 序列化二叉树

难度:困难

一、题目描述:

在这里插入图片描述

二、解题分析:

# 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 __init__(self):
        self.strTree = []

    def serialize(self, root):
        """Encodes a tree to a single string.     
        :type root: TreeNode
        :rtype: str
        """
        if root == None:
            self.strTree.append("null")
            return self.strTree
        # 递归。将当前根节点转化为字符串,再将根节点的左右子树形成字符串。
        curStr = str(root.val)
        self.strTree.append(curStr)
        # print(self.strTree) 查看当前序列化情况
        self.serialize(root.left)
        self.serialize(root.right)
        
        return self.strTree
        
        
    def deserialize(self, data):
        """Decodes your encoded data to tree.   
        :type data: str
        :rtype: TreeNode
        """
        if len(data) == 1 and data[0] == "null":
            return None
        # 每次取字符串数组的第一个元素,判断该元素的位置。
        # 由于使用递归,每次取出一个元素后将其在原数组中移出。
        tmp = data[0]
        data.remove(tmp)
        
        # 如果该元素为空,则说明,到达叶节点。
        # 返回None,当前分支已生成完毕,退回到上一层递归。
        if tmp == "null":
            return None
        # 如果字符不为null,则将其转换成整型数,建立一个树节点。
        # 递归的生成左子树和右子树。
        root = TreeNode(int(tmp))
        # 序列化的时候先左后右,反序列化的时候也要先左后右。
        root.left = self.deserialize(data)
        root.right = self.deserialize(data)
        
        return root
发布了133 篇原创文章 · 获赞 155 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34108714/article/details/104692422