• Python算法——树的序列化与反序列化


    Python中的树的序列化与反序列化

    树的序列化与反序列化是指将树结构转换为字符串表示(序列化),以及将字符串表示还原为原始树结构(反序列化)。在本文中,我们将深入讨论如何实现树的序列化与反序列化算法,提供Python代码实现,并详细说明算法的原理和步骤。

    树的序列化

    树的序列化可以通过深度优先搜索(DFS)来实现。我们可以使用前序遍历或层序遍历的方式将树的节点逐个转换为字符串,并使用特殊符号表示空节点。

    前序遍历序列化
    class TreeNode:
        def __init__(self, value):
            self.val = value
            self.left = None
            self.right = None
    
    def serialize(root):
        if not root:
            return "null"
        
        left = serialize(root.left)
        right = serialize(root.right)
        
        return str(root.val) + "," + left + "," + right
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    层序遍历序列化
    from collections import deque
    
    def serialize_level_order(root):
        if not root:
            return "null"
        
        result = []
        queue = deque([root])
        
        while queue:
            node = queue.popleft()
            if node:
                result.append(str(node.val))
                queue.append(node.left)
                queue.append(node.right)
            else:
                result.append("null")
        
        return ",".join(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    树的反序列化

    树的反序列化需要根据序列化字符串的规律,逐个还原树的节点。对于前序遍历序列化,我们可以通过递归的方式还原;对于层序遍历序列化,我们可以使用队列辅助。

    前序遍历反序列化
    def deserialize(data):
        def helper(values):
            val = values.pop(0)
            if val == "null":
                return None
            node = TreeNode(int(val))
            node.left = helper(values)
            node.right = helper(values)
            return node
    
        values = data.split(",")
        return helper(values)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    层序遍历反序列化
    def deserialize_level_order(data):
        values = data.split(",")
        if not values or values[0] == "null":
            return None
    
        root = TreeNode(int(values[0]))
        queue = deque([root])
        i = 1
    
        while i < len(values):
            current = queue.popleft()
    
            left_val = values[i]
            i += 1
            if left_val != "null":
                current.left = TreeNode(int(left_val))
                queue.append(current.left)
    
            right_val = values[i]
            i += 1
            if right_val != "null":
                current.right = TreeNode(int(right_val))
                queue.append(current.right)
    
        return root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    示例

    考虑以下二叉树:

    # 构建二叉树
    """
            1
           / \
          2   3
         / \
        4   5
    """
    root = TreeNode(1)
    root.left = TreeNode(2)
    root.right = TreeNode(3)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    前序遍历序列化与反序列化
    # 前序遍历序列化
    serialized_tree = serialize(root)
    print("前序遍历序列化:", serialized_tree)
    
    # 前序遍历反序列化
    deserialized_tree = deserialize(serialized_tree)
    
    # 验证反序列化结果
    def print_tree(root):
        if root:
            print_tree(root.left)
            print(root.val, end=" ")
            print_tree(root.right)
    
    print("反序列化后的树:")
    print_tree(deserialized_tree)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出结果:

    前序遍历序列化: 1,2,4,null,null,5,null,null,3,null,null
    反序列化后的树:
    4 2 5 1 3 
    
    • 1
    • 2
    • 3
    层序遍历序列化与反序列化
    # 层序遍历序列化
    serialized_tree_level_order = serialize_level_order(root)
    print("层序遍历序列化:", serialized_tree_level_order)
    
    # 层序遍历反序列化
    deserialized_tree_level_order = deserialize_level_order(serialized_tree_level_order)
    
    # 验证反序列化结果
    print("反序列化后的树:")
    print_tree(deserialized_tree_level_order)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出结果:

    层序遍历序列化: 1,2,3,4,5,null,null,null,null,null,null
    反序列化后的树:
    1 2 3 4 5 
    
    • 1
    • 2
    • 3

    这表示通过序列化与反序列化算法,我们能够将二叉树转换为字符串表示,并成功还原为原始树结构。这种技术在二叉树的存储和传输中经常被使用。通过理解算法的原理和实现,您将能够更好地处理树结构问题。

  • 相关阅读:
    C++【5】类与对象(一) 例子演示
    程序员过中秋丨用代码制作一个祝福小网页(html+css)
    《前端》css总结(上)
    AtCoder ABC322G 数学 + 暴力
    细胞穿膜肽MPG,Mpa-GALFLGFLGAAGSTMGA-OH
    【SimpleFunction系列二.2】SpringBoot注解整合Redisson分布式锁
    英国高中A-Level和IB课程介绍
    css:一个容器(页面),里面有两个div左右摆放并且高度和容器高度一致,左div不会随着页面左右伸缩而变化,右div随页面左右伸缩宽度自适应(手写)
    云原生之深入解析Jenkins多分支管道
    maven清理本地仓库。删除_remote.repositories文件和删除失败的jar包
  • 原文地址:https://blog.csdn.net/weixin_46178278/article/details/134523225