剑指Offer 37. 序列化二叉树(Hard)/ 428. 序列化N叉树(Hard)

在这里插入图片描述
【题目链接】

题解

  1. 序列化二叉树(层序遍历 BFS ,清晰图解)

思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

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

class Codec:
    ### 1129 层序遍历 BFS(116 ms,18.4 MB)
    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        # 若root为空,直接返回'[]'
        if not root: return '[]'

        res = []
        deq = collections.deque() # 定义双端队列deq,并将root入队
        deq.append(root)

        # 双端队列deq非空时,说明还有节点,则进行循环
        while deq:
            # node先入先出
            node = deq.popleft()
            
            # 若node非空,首先记录元素值val,然后左、右子节点分别入队
            if node:
                res.append(str(node.val))
                deq.append(node.left)
                deq.append(node.right)
            # 若node为空,则记录值null
            else: res.append('null')

        return '[' + ','.join(res) + ']' # 返回时需要返回字符串列表

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        # 若data为'[]',则直接返回
        if data == '[]': return

        vals = data[1: -1].split(',') # 注意:首先需要去掉头尾的[和],对中间的元素进行读取和判断操作
        idx = 1                       # vals中第0个元素定义为root根节点,则从第1个元素开始遍历

        root = TreeNode(int(vals[0])) # vals中第0个元素定义为root根节点
        deq = collections.deque()     # 定义双端队列deq,并将root入队
        deq.append(root)

        # 双端队列deq非空时,说明还有节点,则进行循环
        while deq:
            # node先入先出
            node = deq.popleft()

            if vals[idx] != 'null':
                node.left = TreeNode(int(vals[idx]))  # 首先为当前节点赋予左子节点
                deq.append(node.left)                 # 再将此左子节点加入双端队列deq中,为下一层节点赋予子节点做准备
            idx += 1                                  # 指向data中下一个元素

            if vals[idx] != 'null':
                node.right = TreeNode(int(vals[idx])) # 首先为当前节点赋予右子节点
                deq.append(node.right)                # 再将此右子节点加入双端队列deq中,为下一层节点赋予子节点做准备
            idx += 1                                  # 指向data中下一个元素

        return root # 返回root

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

序列化N叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值