题目
难度中等
给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。
注意,根节点 root 位于深度 1 。
加法规则如下:
- 给定整数
depth,对于深度为depth - 1的每个非空树节点cur,创建两个值为val的树节点作为cur的左子树根和右子树根。 cur原来的左子树应该是新的左子树根的左子树。cur原来的右子树应该是新的右子树根的右子树。- 如果
depth == 1意味着depth - 1根本没有深度,那么创建一个树节点,值val作为整个原始树的新根,而原始树就是新根的左子树。
示例 1:
示例 2:
思路
这是一个树的搜索题,使用广搜和深搜都是能解决的
深搜的话就是在递归函数中要留一个参数记录一下现在的深度是多少,到达指定深度后进行节点的插入工作并返回,未到达指定深度并且子节点不为空就递归处理子节点
这里实现的代码是广搜,在这个问题中有记录当前搜索深度的需求
第一种处理方法就是将节点信息再封装一下,例如
type NewNode struct {
node *TreeNode
depth int
}
把自己封装的节点替代原本的节点放到广搜用到的队列,正常走广搜的流程即可,这么操作会有存储额外深度记录的空间开销
另外一种方法就是实现部分中所采用的,将一层的节点存储在一个数组中,将每一层的节点隔离开,可以使用两个动态数组 A 和 B ,A 中存放着当前层的所有节点,在遍历 A 可以求得下一层的节点放入 B。A 数组统计完后将 B 数组中元素移入 A 中然后清空 B,依据 depth 重复上述操作特定次数,就可以移动到要处理的层了
实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func addOneRow(root *TreeNode, val int, depth int) *TreeNode {
// 特殊处理边界情况
if depth == 1 {
return &TreeNode{Val:val, Left:root}
}
// 定位到要处理的层
oneLevel := []*TreeNode{root}
for i := 0 ; i < depth-2 ; i++ {
tmp := oneLevel
oneLevel = nil
for _, node := range tmp {
if node.Left != nil {
oneLevel = append(oneLevel, node.Left)
}
if node.Right != nil {
oneLevel = append(oneLevel, node.Right)
}
}
}
// 插入节点
for _, node := range oneLevel {
node.Left = &TreeNode{Val:val, Left:node.Left}
node.Right = &TreeNode{Val:val, Right:node.Right}
}
return root
}