• 剑指 Offer 37. 序列化二叉树


    1. 题目

    请实现两个函数,分别用来序列化和反序列化二叉树。

    你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

    2. 示例

    输入:root = [1,2,3,null,null,4,5]
    输出:[1,2,3,null,null,4,5]

    3. 题解

    • 序列化(二叉树转字符串数组)
      • 其实这是一个层次遍历,我们只需要层次遍历二叉树,将其值存入数组列表即可。
    • 反序列化(字符串数组转二叉树)
      • 这个是序列化的反转
      • 数组的第一个元素作为根节点
      • 然后创建一个队列,并将根节点放入队列
      • 遍历队列,取对头元素,反复为其创建左右子树,其赋值顺序刚好与字符数组书序一直,用i来控制顺序即可。

    4. 实现

     1 class Codec:
     2     
     3     def serialize(self, root):
     4         """Encodes a tree to a single string.
     5 
     6         :type root: TreeNode
     7         :rtype: str
     8         """
     9         if not root: return "[]"
    10         res = []
    11         # 创建队列,并将root放入队列
    12         queue = collections.deque()
    13         queue.append(root)
    14 
    15         # 当前元素放入列表,当前元素的左子树和右子树入队列
    16         while queue:
    17             node = queue.popleft()
    18             if node:
    19                 res.append(str(node.val))
    20                 queue.append(node.left)
    21                 queue.append(node.right)
    22             else:
    23                 res.append("null")
    24         return '[' + ','.join(res) + ']'
    25 
    26     def deserialize(self, data):
    27         """Decodes your encoded data to tree.
    28 
    29         :type data: str
    30         :rtype: TreeNode
    31         """
    32         if data == "[]":
    33             return
    34         # 获取元素
    35         vals, i = data[1: -1].split(','), 1
    36         # 常见根节点
    37         root = TreeNode(int(vals[0]))
    38         # 创建队列,用来存储所有节点
    39         queue = collections.deque()
    40         queue.append(root)
    41         # 层次遍历所有节点
    42         while queue:
    43             # 获取最左边的节点,然后给给其赋值左右节点
    44             node = queue.popleft()
    45             # 赋值左子节点
    46             if vals[i] != "null":
    47                 node.left = TreeNode(int(vals[i]))
    48                 queue.append(node.left)
    49             # 左子节点创建后,节点值列表后移一位
    50             i += 1
    51             # 赋值右子节点
    52             if vals[i] != "null":
    53                 node.right = TreeNode(int(vals[i]))
    54                 queue.append(node.right)
    55             # 右子节点创建后,节点值列表后移一位
    56             i += 1
    57         return root

    5. 结语

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

     

    但行好事 莫问前程
  • 相关阅读:
    一个最简单的例子学习SAP Cloud for Customer HTML mashup
    SAP C4C Embedded Component最常见的故障原因分析
    使用SAP CRM Mock framework进行单元测试
    ABAP Debugging Script(调试器脚本)使用的一些实际例子
    SAP ABAP字符和字符串变量隐式转换的一些规则
    两种使用代码获得SAP CRM product sales status的办法
    扎根CNCF社区贡献五年是怎样的体验?听听华为云原生开源团队的负责人怎么说
    LiteOS调测利器:backtrace函数原理知多少
    微服务容错时,这些技术你要立刻想到
    Volcano 监控设计解读,一看就懂
  • 原文地址:https://www.cnblogs.com/haifwu/p/15046718.html
Copyright © 2020-2023  润新知