今天开始力扣每日一题打卡,很久没写过代码了所以想通过力扣的每日一题来找找感觉,空闲时就刷点题多写写代码。对于简单题就尽量优化解法,也同时锻炼下代码能力;难题实在想不出来就参考大佬的题解自己写一遍,学习一下大佬的思路。希望能坚持下去吧~下面上题:
2022.8.5 每日一题
题目描述:
给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。
注意,根节点 root 位于深度 1 。
加法规则如下:
给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
cur 原来的左子树应该是新的左子树根的左子树。
cur 原来的右子树应该是新的右子树根的右子树。
如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。
示例1:
输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]
示例2:
输入: root = [4,2,null,3,1], val = 1, depth = 3
输出: [4,2,null,1,1,3,null,null,1]
提示:
节点数在 [1,10e4] 范围内
树的深度在 [1,10e4]范围内
-100 <= Node.val <= 100
-10e5 <= val <= 10e5
1 <= depth <= the depth of tree + 1
题目给出的二叉树定义如下:
/**
* Definition for a binary tree node.
* struct TreeNode* {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
解法
节点数为1~10e4的范围,考虑直接模拟,按照O(n)的复杂度深度优先搜索遍历整个树,找到深度为depth-1的节点,在其与其左子树之间插入一个值为val的新节点,其与其右子树之间同样插入一个值为val的新节点。以上操作基础上稍微做点优化,在深度搜索时找到了深度为depth-1的节点后就可以停止继续往下搜索,这样稍微节省点时间。需要注意的是depth=1这种情况单独处理,因为此时只需要添加一个值为val的新节点并作为新的根节点,原先的树作为新的根节点的左子树。
代码
class Solution {
public:
int d=1;
TreeNode *addOneRow(TreeNode* root, int val, int depth) {
if(depth==1)
{
TreeNode *p=root;
root=new TreeNode(val);
root->left=p;
}
else
dfs(root,val,depth);
return root;
}
void dfs(TreeNode* root,int val,int depth){
if(d==depth-1)
{
TreeNode *q1=new TreeNode(val),*q2=new TreeNode(val);
TreeNode *p1=root->left;
TreeNode *p2=root->right;
root->left=q1;
q1->left=p1;
root->right=q2;
q2->right=p2;
return;
}
if(root->left!=NULL)
{
d++;
dfs(root->left,val,depth);
d--;
}
if(root->right!=NULL)
{
d++;
dfs(root->right,val,depth);
d--;
}
return;
}
};
代码思路
总体过程就是模拟,简单的DFS遍历二叉树,变量d记录当前搜索到的点的深度,准备搜索下一个点时d+1,结束了return之后d-1。插入二叉树节点的操作和链表插入新节点类似,二叉树节点指针的写法留意一下不要写错。
总结
这种直接模拟的题目思路一般都不难,照着题目做就完事了,这题也没有什么特别精妙的优化,主要就用来巩固下代码能力了,毕竟这么久没写了一个二叉树指针都让我写出好多编译错误。。。然后特殊情况depth=1单独处理注意一下,其他好像没啥可说的。还是得多写代码,奥利给!