题目
完全二叉树是每一层(除最后一层外)都是完全填充(即,结点数达到最大)的,并且所有的结点都尽可能地集中在左侧。
设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:
- CBTInserter(TreeNode root) 使用头结点为 root 的给定树初始化该数据结构;
- CBTInserter.insert(int v) 将 TreeNode 插入到存在值为 node.val = v 的树中以使其保持完全二叉树的状态,并返回插入的 TreeNode 的父结点的值;
- CBTInserter.get_root() 将返回树的头结点。
【中等】
【分析】使用列表来装树的父结点,如此既可以实现完全二叉树的数组形式(即可以O(1)定位到要插入结点的父结点,实现快速插入)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class CBTInserter:
def __init__(self, root: TreeNode):
nodes=[root]
self.CBT=[] #既可以得到数组的形式,又可以保留树结构;有点耗费空间,但是也便于insert操作
while nodes:
node=nodes.pop(0)
self.CBT.append(node)
if node.left:
nodes.append(node.left)
if node.right:
nodes.append(node.right)
def insert(self, v: int) -> int:
import math
parent=math.floor((len(self.CBT)-1)/2)
if self.CBT[parent].left:
print("left")
self.CBT[parent].right=TreeNode(v)
self.CBT.append(self.CBT[parent].right)
else:
self.CBT[parent].left=TreeNode(v)
self.CBT.append(self.CBT[parent].left)
return self.CBT[parent].val
def get_root(self) -> TreeNode:
return self.CBT[0]
# Your CBTInserter object will be instantiated and called as such:
# obj = CBTInserter(root)
# param_1 = obj.insert(v)
# param_2 = obj.get_root()
时长上较长,以后再看是否有改进。