python-leetcode-919. 完全二叉树插入器

919. 完全二叉树插入器 - 力扣(LeetCode)

可以使用一个队列来维护完全二叉树的层次结构,确保插入的新节点始终满足完全二叉树的特性。以下是 CBTInserter 的实现:

from collections import deque

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class CBTInserter:
    def __init__(self, root: TreeNode):
        self.root = root
        self.deque = deque()
        
        # 使用层序遍历初始化队列,确保队列中存储的是可以插入新节点的父节点
        queue = deque([root])
        while queue:
            node = queue.popleft()
            if not node.left or not node.right:
                self.deque.append(node)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
    
    def insert(self, v: int) -> int:
        parent = self.deque[0]  # 队列头部的节点是当前可以插入新节点的父节点
        new_node = TreeNode(v)
        
        if not parent.left:
            parent.left = new_node
        else:
            parent.right = new_node
            self.deque.popleft()  # 父节点已满,移除
        
        self.deque.append(new_node)  # 新插入的节点可能会成为未来的父节点
        return parent.val
    
    def get_root(self) -> TreeNode:
        return self.root

设计思路:

  1. 初始化 (__init__)

    • 通过层序遍历初始化一个队列 deque,其中存储的是当前可以接收新子节点的父节点。
    • 只要某个节点的左右子节点没有同时存在,它就会被加入 deque
  2. 插入 (insert)

    • deque 队列的头部作为父节点,并插入新节点。
    • 如果父节点的左子节点为空,则插入左子节点;否则插入右子节点,并从 deque 中移除该父节点(因为它已满)。
    • 将新节点加入 deque,因为它未来可能会成为父节点。
  3. 获取根节点 (get_root)

    • 直接返回 root

这种方法保证了插入操作的时间复杂度为 O(1),初始化的时间复杂度为 O(N)(其中 N 是节点数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值