可以使用一个队列来维护完全二叉树的层次结构,确保插入的新节点始终满足完全二叉树的特性。以下是 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
设计思路:
-
初始化 (
__init__
):- 通过层序遍历初始化一个队列
deque
,其中存储的是当前可以接收新子节点的父节点。 - 只要某个节点的左右子节点没有同时存在,它就会被加入
deque
。
- 通过层序遍历初始化一个队列
-
插入 (
insert
):- 取
deque
队列的头部作为父节点,并插入新节点。 - 如果父节点的左子节点为空,则插入左子节点;否则插入右子节点,并从
deque
中移除该父节点(因为它已满)。 - 将新节点加入
deque
,因为它未来可能会成为父节点。
- 取
-
获取根节点 (
get_root
):- 直接返回
root
。
- 直接返回
这种方法保证了插入操作的时间复杂度为 O(1),初始化的时间复杂度为 O(N)(其中 N 是节点数)。