题目难度: 中等
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大,第 n 层有 2n-1 个节点)的,并且所有的节点都尽可能地集中在左侧。
设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:
["CBTInserter","insert","get_root"]
, inputs = [[[1]],[2],[]]
[null,1,[1,2]]
["CBTInserter","insert","insert","get_root"]
, inputs = [[[1,2,3,4,5,6]],[7],[8],[]]
[null,3,4,[1,2,3,4,5,6,7,8]]
class CBTInserter:
def __init__(self, root: TreeNode):
self.root = root
self.levels = []
q = [root]
while q:
curlen = len(q)
for node in q[:curlen]:
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
# 将当前层加入levels列表
self.levels.append(q[:curlen])
q = q[curlen:]
def insert(self, v: int) -> int:
h = len(self.levels) - 1
if len(self.levels[-1]) == 1 << h:
# 最底层满了, 需要新建一层
self.levels.append([])
# 父节点下标是当前待插入下标除以2
pi = len(self.levels[-1]) // 2
# 父节点在倒数第二层, 根据其下标得到父节点
parent = self.levels[-2][pi]
# 追加父子连接
node = TreeNode(v)
if not parent.left:
# 父节点的左子节点还不存在, 将其指定为node
parent.left = node
else:
# 父节点的左子节点已存在, 将右子节点指定为node
parent.right = node
# 将node添加到最底层
self.levels[-1].append(node)
return parent.val
def get_root(self) -> TreeNode:
return self.root
大家可以在下面这些地方找到我~😊
我的公众号: 算法精选, 欢迎大家扫码关注~😊