二叉树的序列化与反序列化_Python实现

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

'''
前序遍历实现
'''
class Solution:
    def serialize(self, root):
        if root is None: return 'None'
        return str(root.val) + ','\
            + str(self.serialize(root.left))\
            + ',' + str(self.serialize(root.right))
    def deserialize(self, data):
        def dfs(data_list):
            val = data_list.pop(0)
            if val == 'None': return None
            root = TreeNode(int(val))
            root.left = dfs(data_list)
            root.right = dfs(data_list)
            return root
    data_list = data.split(',')
    return dfs(data_list)
'''
后续遍历实现
'''
class Solution:
    def serialize(self, root):
        if root is None: return 'None'
        return str(self.serialize(root.left))\
            + ',' + str(self.serialize(root.right))\
            + ',' + str(root.val)
        
    def deserialize(self, datalist):
        def dfs(data_list):
            val = data_list.pop()
            if val = 'None': return None
            root = TreeNode(val)
            root.right = dfs(data_list)
            root.left = dfs(data_list)
            return root
        datalist = data.split(',')
        return dfs(datalist)
'''
中序遍历可以实现的二叉树的序列化,
但是无法进行反序列化,
因为与前序遍历和后序遍历不同的是:
    中序遍历无法确定树的根节点
'''
'''
层级遍历的解法实现序列化和反序列化
'''
# 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
        """
        def traverse(root):
            tmp_list = [root]
            ans = ''
            while len(tmp_list) > 0:
                cur_node = tmp_list.pop(0)
                if cur_node is None:
                    ans = ans + "None" + ','
                    continue

                ans = ans + str(cur_node.val) + ','
                
                tmp_list.append(cur_node.left)
                tmp_list.append(cur_node.right)
            return ans
        res = traverse(root)
        return res

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if len(data) == 0: return []
        data_list = data[0:-1].split(',')
        print(data)
        print(data_list)
        if data_list[0] == 'None': return []
        root = TreeNode(data_list[0])
        tmp_list = [root]
        i = 0
        n = len(data_list) 
        while i < n-2:
            if len(tmp_list) == 0: break
            parent = tmp_list.pop(0)
            i += 1
            left = data_list[i]
            if left == 'None':
                parent.left = None
            else:
                parent.left = TreeNode(int(left))
                tmp_list.append(parent.left)
            i += 1
            right = data_list[i]
            if right == 'None':
                parent.right = None
            else:
                parent.right = TreeNode(int(right))
                tmp_list.append(parent.right)
        return root

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值