最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C C++ LeetCode題解在二叉樹中增加一行示例詳解

 更新時(shí)間:2022年10月12日 11:41:58   作者:Junkman丶  
這篇文章主要為大家介紹了C C++ LeetCode題解在二叉樹中增加一行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目描述

題目鏈接:623. 在二叉樹中增加一行

給定一個(gè)二叉樹的根 root 和兩個(gè)整數(shù) val 和 depth ,在給定的深度 depth 處添加一個(gè)值為 val 的節(jié)點(diǎn)行。

注意,根節(jié)點(diǎn) root 位于深度 1 。

加法規(guī)則如下:

  • 給定整數(shù) depth,對(duì)于深度為 depth - 1 的每個(gè)非空樹節(jié)點(diǎn) cur ,創(chuàng)建兩個(gè)值為 val 的樹節(jié)點(diǎn)作為 cur 的左子樹根和右子樹根。
  • cur 原來的左子樹應(yīng)該是新的左子樹根的左子樹。
  • cur 原來的右子樹應(yīng)該是新的右子樹根的右子樹。
  • 如果 depth == 1 意味著 depth - 1 根本沒有深度,那么創(chuàng)建一個(gè)樹節(jié)點(diǎn),值 val 作為整個(gè)原始樹的新根,而原始樹就是新根的左子樹。

提示:

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

整理題意

題目給定一棵二叉樹,要求我們?cè)谏疃葹?depth 的位置插入一行節(jié)點(diǎn),這些節(jié)點(diǎn)的值為 val,題目規(guī)定根節(jié)點(diǎn)所在層位 1,且插入節(jié)點(diǎn) val 的時(shí)候,原來節(jié)點(diǎn)的左子樹要連接在新節(jié)點(diǎn)的左子樹上,原來節(jié)點(diǎn)的右子樹要連接在新節(jié)點(diǎn)的右子樹上。

需要特別注意 depth = 1 的情況,此時(shí)將新節(jié)點(diǎn)作為根節(jié)點(diǎn),將原來的根節(jié)點(diǎn)連接在新節(jié)點(diǎn)的左子樹上。

解題思路分析

層序遍歷(廣度優(yōu)先搜索)

根據(jù)題意描述,很容易想到使用 BFS 對(duì)整棵樹進(jìn)行層序遍歷,在遍歷到第 depth - 1 層時(shí)按照題意進(jìn)行插入節(jié)點(diǎn)即可。

遞歸(深度優(yōu)先搜索)

該題還可以通過給定的函數(shù)本身進(jìn)行遞歸完成,在遞歸的過程中不斷維護(hù)當(dāng)前 depth 的值,當(dāng) depth 的值為 2 時(shí)進(jìn)行節(jié)點(diǎn)的插入即可。

具體實(shí)現(xiàn)

常規(guī)的二叉樹搜索,在對(duì)整棵二叉樹進(jìn)行搜索的同時(shí)維護(hù)當(dāng)前樹的深度即可,在第 depth 按照題意進(jìn)行插入節(jié)點(diǎn)即可。

在實(shí)現(xiàn)過程中需要注意特判 depth = 1 的情況,也就是當(dāng)插入的層數(shù)為 1 時(shí),需要將根節(jié)點(diǎn)放在新插入節(jié)點(diǎn)的左子樹上,并返回新插入的這個(gè)節(jié)點(diǎn)。

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:O(n),其中 n 為輸入的樹的節(jié)點(diǎn)數(shù)。最壞情況下,需要遍歷整棵樹。
  • 空間復(fù)雜度:O(n),在層序遍歷中隊(duì)列空間開銷最多為 O(n),遞歸的深度最多為 O(n)。

代碼實(shí)現(xiàn)

層序遍歷(廣度優(yōu)先搜索)

/**
 * 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) {
        // 特判 depth = 1 的情況
        if(depth == 1){
            TreeNode *res = new TreeNode(val);
            res->left = root;
            return res;
        }
        // k 記錄當(dāng)前層數(shù)
        int k = 1;
        queue<TreeNode*> que;
        while(que.size()) que.pop();
        que.push(root);
        // bfs層序遍歷
        while(que.size()){
            int n = que.size();
            // 遍歷到 depth - 1 層時(shí)開始插入元素 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;
            }
            // 壓入下一層節(jié)點(diǎn)元素
            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;
    }
};

遞歸(深度優(yōu)先搜索)

/**
 * 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 root;
        // 特判 depth = 1 的情況
        if(depth == 1){
            return new TreeNode(val, root, nullptr);
        }
        // 當(dāng) depth 到第 2 層時(shí)表示 在當(dāng)前層的下一層插入節(jié)點(diǎn) 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;
    }
};

總結(jié)

  • 該題為常規(guī)的搜索題,既可以使用廣度優(yōu)先搜索進(jìn)行層序遍歷來完成,也可以使用深度優(yōu)先搜索來遞歸完成,因?yàn)轭}目描述為插入一層元素節(jié)點(diǎn),很容易想到層序遍歷,而遞歸的方法較難想到,在實(shí)現(xiàn)過程中可以嘗試使用遞歸的方式來完成,可以鍛煉遞歸的思維以及在實(shí)現(xiàn)遞歸時(shí)的各種邊界考慮。同時(shí)遞歸的代碼也比層序遍歷的代碼更為簡(jiǎn)潔。
  • 測(cè)試結(jié)果:

以上就是C C++ LeetCode題解在二叉樹中增加一行示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C C++ 在二叉樹中增加一行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一起來練習(xí)C++的指針

    一起來練習(xí)C++的指針

    這篇文章主要為大家詳細(xì)介紹了C++的指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和

    C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和

    這篇文章主要介紹了C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C#中委托的基本用法總結(jié)

    C#中委托的基本用法總結(jié)

    以下是對(duì)C#中委托的基本用法進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友可以過來參考下。希望對(duì)大家有所幫助
    2013-09-09
  • C語言的隨機(jī)數(shù)rand()函數(shù)詳解

    C語言的隨機(jī)數(shù)rand()函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語言的隨機(jī)數(shù)rand()函數(shù),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 使用Qt開發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果

    使用Qt開發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果

    我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么就拿qt來做一個(gè)吧,文章通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • FFmpeg實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4

    FFmpeg實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4

    這篇文章主要為大家詳細(xì)介紹了FFmpeg如何實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4,即從內(nèi)存塊中獲取原始數(shù)據(jù),然后依次進(jìn)行解碼、編碼、最后保存成mp4視頻文件,感興趣的可以了解一下
    2023-08-08
  • C++ primer類的基礎(chǔ)精講

    C++ primer類的基礎(chǔ)精講

    C++類,是指系統(tǒng)在第一次在程序中遇到一個(gè)類時(shí)為這個(gè)類建立它的所有類變量的拷貝 - 這個(gè)類的所有實(shí)例共享它的類變量
    2022-07-07
  • C語言中scanf與scanf_s函數(shù)的使用詳解

    C語言中scanf與scanf_s函數(shù)的使用詳解

    本文主要介紹了C語言中scanf與scanf_s函數(shù)的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++中hashmap的一些使用建議

    C++中hashmap的一些使用建議

    由于hashmap不是c++ stl中標(biāo)準(zhǔn)實(shí)現(xiàn),這樣在跨平臺(tái)使用時(shí)就可能會(huì)出現(xiàn)問題,下面這篇文章主要給大家介紹了關(guān)于C++中hashmap的一些使用建議,需要的朋友可以參考下
    2023-03-03
  • C語言中儲(chǔ)存類別與內(nèi)存管理的深入理解

    C語言中儲(chǔ)存類別與內(nèi)存管理的深入理解

    這篇文章主要給大家介紹了關(guān)于C語言中儲(chǔ)存類別與內(nèi)存管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

保康县| 方正县| 汽车| 仁寿县| 贞丰县| 金湖县| 黄平县| 志丹县| 永登县| 揭东县| 宜兰市| 炉霍县| 女性| 珲春市| 上饶县| 霍邱县| 大邑县| 吉首市| 江阴市| 县级市| 清水河县| 宜丰县| 萨嘎县| 青冈县| 胶州市| 聂拉木县| 仪征市| 吴忠市| 湟源县| 玉门市| 盐城市| 获嘉县| 简阳市| 会宁县| 武山县| 汝城县| 石狮市| 芦山县| 克拉玛依市| 昌宁县| 和政县|