文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

CC++LeetCode题解在二叉树中增加一行示例详解

2022-11-13 18:17

关注

题目描述

题目链接:623. 在二叉树中增加一行

给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。

注意,根节点 root 位于深度 1 。

加法规则如下:

提示:

示例 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]

整理题意

题目给定一棵二叉树,要求我们在深度为 depth 的位置插入一行节点,这些节点的值为 val,题目规定根节点所在层位 1,且插入节点 val 的时候,原来节点的左子树要连接在新节点的左子树上,原来节点的右子树要连接在新节点的右子树上。

需要特别注意 depth = 1 的情况,此时将新节点作为根节点,将原来的根节点连接在新节点的左子树上。

解题思路分析

层序遍历(广度优先搜索)

根据题意描述,很容易想到使用 BFS 对整棵树进行层序遍历,在遍历到第 depth - 1 层时按照题意进行插入节点即可。

递归(深度优先搜索)

该题还可以通过给定的函数本身进行递归完成,在递归的过程中不断维护当前 depth 的值,当 depth 的值为 2 时进行节点的插入即可。

具体实现

常规的二叉树搜索,在对整棵二叉树进行搜索的同时维护当前树的深度即可,在第 depth 按照题意进行插入节点即可。

在实现过程中需要注意特判 depth = 1 的情况,也就是当插入的层数为 1 时,需要将根节点放在新插入节点的左子树上,并返回新插入的这个节点。

复杂度分析

代码实现

层序遍历(广度优先搜索)


class Solution {
public:
    TreeNode* addOneRow(TreeNode* root, int val, int depth) {
        // 特判 depth = 1 的情况
        if(depth == 1){
            TreeNode *res = new TreeNode(val);
            res->left = root;
            return res;
        }
        // k 记录当前层数
        int k = 1;
        queue<TreeNode*> que;
        while(que.size()) que.pop();
        que.push(root);
        // bfs层序遍历
        while(que.size()){
            int n = que.size();
            // 遍历到 depth - 1 层时开始插入元素 val
            if(k == depth - 1){
                for(int i = 0; i < n; i++){
                    TreeNode *now = que.front();
                    que.pop();
                    TreeNode *l = new TreeNode(val, now->left, NULL);
                    TreeNode *r = new TreeNode(val, NULL, now->right);
                    now->left = l;
                    now->right = r;
                }
                // 插入完成后跳出
                break;
            }
            // 压入下一层节点元素
            for(int i = 0; i < n; i++){
                TreeNode *now = que.front();
                que.pop();
                if(now->left != NULL) que.push(now->left);
                if(now->right != NULL) que.push(now->right);
            }
            k++;
        }
        return root;
    }
};

递归(深度优先搜索)


class Solution {
public:
    TreeNode* addOneRow(TreeNode* root, int val, int depth) {
        if(root == nullptr) return root;
        // 特判 depth = 1 的情况
        if(depth == 1){
            return new TreeNode(val, root, nullptr);
        }
        // 当 depth 到第 2 层时表示 在当前层的下一层插入节点 val
        if(depth == 2){
            root->left = new TreeNode(val, root->left, nullptr);
            root->right = new TreeNode(val, nullptr, root->right);
            return root;
        }
        // 否则一直递归
        else{
            root->left = addOneRow(root->left, val, depth - 1);
            root->right = addOneRow(root->right, val, depth - 1);
        }
        return root;
    }
};

总结

以上就是C C++ LeetCode题解在二叉树中增加一行示例详解的详细内容,更多关于C C++ 在二叉树中增加一行的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯