LeetCode每日一题打卡(1) 623. 在二叉树中增加一行

今天开始力扣每日一题打卡,很久没写过代码了所以想通过力扣的每日一题来找找感觉,空闲时就刷点题多写写代码。对于简单题就尽量优化解法,也同时锻炼下代码能力;难题实在想不出来就参考大佬的题解自己写一遍,学习一下大佬的思路。希望能坚持下去吧~下面上题:

2022.8.5 每日一题

623. 在二叉树中增加一行

题目描述:

给定一个二叉树的根 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

扫描二维码关注公众号,回复: 15100164 查看本文章

题目给出的二叉树定义如下:

/**
 * 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单独处理注意一下,其他好像没啥可说的。还是得多写代码,奥利给!

猜你喜欢

转载自blog.csdn.net/qq_43824745/article/details/126183997