LC 919. 完全二叉树插入器 (opens new window) (opens new window)
中等
# 问题描述
完全二叉树 是每一层(除最后一层外)都是完全填充(即,节点数达到最大)的,并且所有的节点都尽可能地集中在左侧。
设计一种算法,将一个新节点插入到一个完整的二叉树中,并在插入后保持其完整。
实现 CBTInserter
类:
CBTInserter(TreeNode root)
使用头节点为root
的给定树初始化该数据结构;CBTInserter.insert(int v)
向树中插入一个值为Node.val == val
的新节点TreeNode
。使树保持完全二叉树的状态,并返回插入节点TreeNode
的父节点的值;CBTInserter.get_root()
将返回树的头节点。
示例 1:
输入
["CBTInserter", "insert", "insert", "get_root"]
[[[1, 2]], [3], [4], []]
输出
[null, 1, 2, [1, 2, 3, 4]]
解释
CBTInserter cBTInserter = new CBTInserter([1, 2]);
cBTInserter.insert(3); // 返回 1
cBTInserter.insert(4); // 返回 2
cBTInserter.get_root(); // 返回 [1, 2, 3, 4]
提示:
- 树中节点数量范围为
[1, 1000]
0 <= Node.val <= 5000
root
是完全二叉树0 <= val <= 5000
- 每个测试用例最多调用
insert
和get_root
操作104
次
# 队列
对于一棵完全二叉树而言,节点插入顺序是从上到下,从左到右,该顺序也是层次遍历的顺序,因此,初始化时,对原始的树进行一次层次遍历,遍历过程中,若存在子节点为空的节点,则加入队列中,在插入操作时,将新增节点插入到队首节点中,若队首节点插入后左右节点都有值,则将其出队,最后将新增节点入队。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
*/
var CBTInserter = function (root) {
this.root = root
this.queue = []
const q = [root]
while (q.length) {
const node = q.shift()
if (!node.left || !node.right) this.queue.push(node)
if (node.left) q.push(node.left)
if (node.right) q.push(node.right)
}
}
/**
* @param {number} val
* @return {number}
*/
CBTInserter.prototype.insert = function (val) {
const node = new TreeNode(val)
const parent = this.queue[0]
if (!this.queue[0].left) {
this.queue[0].left = node
} else {
this.queue[0].right = node
this.queue.shift()
}
this.queue.push(node)
return parent.val
}
/**
* @return {TreeNode}
*/
CBTInserter.prototype.get_root = function () {
return this.root
}
/**
* Your CBTInserter object will be instantiated and called as such:
* var obj = new CBTInserter(root)
* var param_1 = obj.insert(val)
* var param_2 = obj.get_root()
*/
- 时间复杂度:初始化 为 , 为初始完全二叉树节点数。 和 时间复杂度为
- 空间复杂度:, 是 的调用次数,每次调用,新增的节点会添加到队列中。
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!