携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
题目描述
给定一个二叉树的根root,以及两个值val、depth,要求将值为val的节点插入到二叉树的depth-1层的所有节点的左右孩子中,原depth-1层的左孩子变为新插入节点的左孩子,原depth-1层的右节点变为新插入节点的右孩子。
例1:输入:数的层次遍历为:[1,3,4,2,5,null,8] val=3 depth=1 输出:树的层次遍历为:[1,3,4,1,1,1,1,2,null,null,5,null,null,null,8]
解释:输入的二叉树的树形结构如上图所示,在第三层插入值为1的节点后应变为下图所示结构,第二层的所有节点的左右孩子变为新的值为1的节点,第二层原先的左右孩子变为新插入节点的左孩子或者右孩子。
本题值得注意的地方
- 如果输入的depth为1的特殊情况时,此时应该将根节点变为新节点的左孩子。
原题地址:623. 在二叉树中增加一行
解题思路
首先当depth为1时,直接创建一个值为val的节点node,然后把node的左孩子指向根节点即可。
当depth大于1时,我们首先应该做的是找到depth-1层的所有节点,然后依次的处理depth-1层的所有节点。处理的思路:记录当前节点的左右孩子,创建两个新的值为val的节点node1、node2,node1的左孩子指向原先节点的左孩子,node2的右孩子指向原先节点的右孩子。然后将原先节点的左右孩子分别指向新节点node1、node2即可,就这样处理完depth-1层的所有节点即可。
对于如何找到depth-1层的所有节点,可以利用队列的方式来获取,之前的一个文章中的解题思路中已经解释原理,这里就不再赘述。获取二叉树某层的节点
实现代码
class Solution {
public:
TreeNode* addOneRow(TreeNode* root, int val, int depth) {
// 单独处理depth为1的特殊情况
if(depth == 1){
TreeNode *node = new TreeNode(val);
node->left = root;
return node;
}
// 利用队列记录每层的所有节点
queue<TreeNode*> queue;
queue.push(root);
int dep = 1,num = 1;
// 寻找 depth-1 层的所有节点
while(dep<depth-1){
dep++;
num = queue.size();
while(num--){
auto t = queue.front();
queue.pop();
if(t->left) queue.push(t->left);
if(t->right) queue.push(t->right);
}
}
// 处理 depth-1 层的所有节点
while(queue.size()){
auto t = queue.front();
queue.pop();
// 创建两个新的值为val的节点,将原先节点的左孩子放到node1的左孩子中,将原先节点的右孩子放到node2的右孩子中
TreeNode *node1 = new TreeNode(val,t->left,nullptr),*node2 = new TreeNode(val,nullptr,t->right);
// 将节点的左右孩子指向新创建的值为val的节点
t->left = node1,t->right=node2;
}
return root;
}
};