0x00 题目
给定一个二叉树的根 root 和两个整数 val 和 depth 在给定的深度 depth 处添加一个值为 val 的节点行
注意:根节点 root 位于深度 1
加法规则如下:
给定整数 depth 对于深度为 depth - 1 的每个非空树节点 cur 创建两个值为 val 的树节点作为 cur 的左子树根和右子树根
cur 原来的 左子树 应该是新的 左 子树根的 左子树 cur 原来的 右子树 应该是新的 右 子树根的 右子树 如果 depth == 1 意味着 depth - 1 根本没有深度 那么创建一个树节点 值 val 作为整个原始树的新根 而 原始树 就是新根的 左子树
0x01 思路
因为要添加 一整行 所以要先 找到 要添加新节点的行 使用 层序 遍历方式 先找到 目标行 再添加新节点 即可
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func addOneRow(_ root: TreeNode?, _ val: Int, _ depth: Int) -> TreeNode? {
guard let root = root else { return root }
// depth 为 1 时
if depth == 1 {
let node = TreeNode(val)
node.left = root
return node
}
// 插入新节点方法
func insert(_ root: TreeNode, _ val: Int) {
let left = TreeNode(val)
let right = TreeNode(val)
left.left = root.left
right.right = root.right
root.left = left
root.right = right
}
// 深度
var d: Int = 1
var queue: [TreeNode] = []
queue.append(root)
while !queue.isEmpty {
// 找到目标行
if d == depth - 1 {
// 整行都要插入新节点
for node in queue {
insert(node, val)
}
break
}
// 下一层节点
var temp: [TreeNode] = []
while !queue.isEmpty {
let node = queue.removeFirst()
if let left = node.left {
temp.append(left)
}
if let right = node.right {
temp.append(right)
}
}
// 下一层
queue = temp
// 深度加 1
d += 1
}
return root
}
0x03 我的作品
欢迎体验我的作品之一:小笔记 让笔记 一步到位! App Store 搜索即可~
|