0
点赞
收藏
分享

微信扫一扫

每日一练 — 2022.02.16

TiaNa_na 2022-02-16 阅读 83

文章目录


一,二叉树的序列化与反序列化

1,程序简介

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

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

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式(/faq/#binary-tree)。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

示例 1:

在这里插入图片描述

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

示例 2:

  • 输入:root = []
  • 输出:[]

示例 3:

  • 输入:root = [1]
  • 输出:[1]

示例 4:

  • 输入:root = [1,2]
  • 输出:[1,2]

提示:

  • 树 中 结 点 数 在 范 围 [ 0 , 1 0 4 ] 内 树中结点数在范围 [0, 10^4] 内 [0,104]
  • -1000 <= Node.val <= 1000

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 16 18:48:30 2022
Function: 二叉树的序列化与反序列化
@author: 小梁aixj
"""
class TreeNode:
    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
        """
        if root == None:
            return "null,"
        left_serialize = self.serialize(root.left)
        right_serialize = self.serialize(root.right)
        return str(root.val) + "," + left_serialize + right_serialize
    def deserialize(self, data):
        """Decodes your encoded data to tree.
        :type data: str
        :rtype: TreeNode
        """
        def dfs(queue):
            val = queue.popleft()
            if val == "null":
                return None
            node = TreeNode(val)
            node.left = dfs(queue)
            node.right = dfs(queue)
            return node
        from collections import deque
        queue = deque(data.split(","))
        return dfs(queue)
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))

二,填充每个节点的下一个右侧节点指针 II

1,程序简介

给定一个二叉树

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例:

  • 输入:root = [1,2,3,4,5,null,7]
  • 输出:[1,#,2,3,#,4,5,7,#]
  • 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),’#’ 表示每层的末尾。

提示:

  • 树中的节点数小于 6000
  • -100 <= node.val <= 100

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 16 18:54:38 2022
Function: 填充每个节点的下一个右侧节点指针 II
@author: 小梁aixj
"""
class Node(object):
    def __init__(self, val, left, right, next):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
class Solution:
    def connect(self, root: "Node") -> "Node":
        if root == None:
            return None
        firstNode = root
        while firstNode:
            while firstNode and firstNode.left == None and firstNode.right == None:
                firstNode = firstNode.next
            if firstNode == None:
                break
            cur = firstNode
            pre = None
            while cur:
                if cur.left:
                    if pre:
                        pre.next = cur.left
                    pre = cur.left
                if cur.right:
                    if pre:
                        pre.next = cur.right
                    pre = cur.right
                cur = cur.next
            firstNode = firstNode.left if firstNode.left else firstNode.right
        return root

三,存在重复元素 II

1,程序简介

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

示例 1:

  • 输入: nums = [1,2,3,1], k = 3
  • 输出: true

示例 2:

  • 输入: nums = [1,0,1,1], k = 1
  • 输出: true

示例 3:

  • 输入: nums = [1,2,3,1,2,3], k = 2
  • 输出: false

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 16 18:54:58 2022
Function: 存在重复元素 II
@author: 小梁aixj
"""
class Solution:
    def containsNearbyDuplicate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        if len(list(set(nums))) == len(nums):
            return False
        left = 0
        right = left + k
        if k >= len(nums):
            return len(list(set(nums))) < len(nums)
        while right < len(nums):
            while left < right:
                if nums[left] == nums[right]:
                    return True
                else:
                    right -= 1
            left += 1
            right = left + k
        if len(list(set(nums[left:]))) < len(nums[left:]):
            return True
        return False
举报

相关推荐

0 条评论