• 【LeetCode】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, 104] 范围内
    树的深度在 [1, 104]范围内
    -100 <= Node.val <= 100
    -105 <= val <= 105
    1 <= depth <= the depth of tree + 1

    题解

    广度优先遍历
    depth-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) {}
     * };
     */
    class Solution {
    public:
        TreeNode* addOneRow(TreeNode* root, int val, int depth) {
            if(depth == 1)
                return new TreeNode(val,root,nullptr);
    
            int high = 1;
            queue<TreeNode*> myqueue;
            myqueue.emplace(root);
    
            while(!myqueue.empty())
            {
                if(high == depth-1)
                {
                    while(!myqueue.empty())
                    {
                        TreeNode* node = myqueue.front();
                        myqueue.pop(); 
                        node->left = new TreeNode(val,node->left,nullptr);
                        node->right = new TreeNode(val,nullptr,node->right);
                    }
                    break;
                }
                queue<TreeNode*> tmp;
                while(!myqueue.empty())
                {
                    TreeNode* node = myqueue.front();
                    myqueue.pop(); 
                     
                    if(node->left)
                        tmp.emplace(node->left);
                    if(node->right)
                        tmp.emplace(node->right);
                }
                myqueue.swap(tmp);
                high++;
            }
    
            return root;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    递归

    /**
     * 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) {}
     * };
     */
    class Solution {
    public:
        TreeNode* addOneRow(TreeNode* root, int val, int depth) {
            if(root==nullptr)
                return nullptr;
            if(depth == 1)
                return new TreeNode(val,root,nullptr);
            if(depth == 2)
            {
                root->left = new TreeNode(val,root->left,nullptr);
                root->right = new TreeNode(val,nullptr,root->right);
            }
            else
            {
                root->left = addOneRow(root->left,val,depth-1);
                root->right = addOneRow(root->right,val,depth-1);
            }
            return root;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    【AIGC调研系列】copilot在自动化测试脚本中的实际应用效果
    练习用信号量的方式,创建两个线程A B1. A线程读取文件中的内容2. B线程打印A读取到的内容到终端,3.全部打印完毕后,结束进程;4.现象类似cat个文件
    virtualbox虚拟机安装在笔记本上使用WIFI无法上网
    C++之多态详解
    蘑菇街获得mogujie商品详情 API 返回值说明
    低碳水化合物和生酮饮食是如何影响运动表现的?
    【MySQL进阶】B+树索引的使用
    flutter ios Firebase 消息通知错误 I-COR000005,I-FCM001000 解决
    java毕业生设计医学生在线学习交流平台计算机源码+系统+mysql+调试部署+lw
    c++均值滤波:cv::blur
  • 原文地址:https://blog.csdn.net/qq_45972928/article/details/126171470