zoukankan      html  css  js  c++  java
  • 剑指 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. 结语

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

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

     

    但行好事 莫问前程
  • 相关阅读:
    整理了一份FAQ,新手看一下
    分享:pythonbitstring 3.1.2 发布
    分享:TokuDB v7 发布,并宣布全面开源
    在美国学CS能挣多少钱?美国IT公司标准 offer package详细数字及绿卡政策 | 美国留学申请与就业找工作咨询博客|Warald|一亩三分地论坛
    写的split带改进
    分享:一个多进程并发执行程序ps命令 ls命令
    分享:vi/vim使用进阶: 指随意动,移动如飞 (一)
    waning rm i rm rvfi
    分享:C++中头文件、源文件之间的区别与联系
    分享:神奇的动归状态转移方程——最优子序列
  • 原文地址:https://www.cnblogs.com/haifwu/p/15046718.html
Copyright © 2011-2022 走看看