LeetCode 每日一題——623. 在二叉樹中增加一行

1.題目描述

623. 在二叉樹中增加一行

給定一個二叉樹的根 root 和兩個整數(shù) val 和 depth 最爬,在給定的深度 depth 處添加一個值為 val 的節(jié)點行怜俐。

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

加法規(guī)則如下:

給定整數(shù) depth降瞳,對于深度為 depth - 1 的每個非空樹節(jié)點 cur 责静,創(chuàng)建兩個值為 val 的樹節(jié)點作為 cur 的左子樹根和右子樹根。
cur 原來的左子樹應該是新的左子樹根的左子樹憨奸。
cur 原來的右子樹應該是新的右子樹根的右子樹。
如果 depth == 1 意味著 depth - 1 根本沒有深度凿试,那么創(chuàng)建一個樹節(jié)點排宰,值 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]

2.解題思路與代碼

2.1 解題思路

這道題因為需要在指定深度的層上加一層板甘,所以考慮使用 BFS 進行解答。首先考慮當給定 depth 等于 1 的時候详炬,即要把 val 插入到根節(jié)點之上盐类,按照題目要求直接創(chuàng)建新的根節(jié)點 newRoot,并且讓新的根節(jié)點的 left 指向原來的根節(jié)點,即 newRoot.left = root在跳,代碼如下:

if (depth == 1) {
    TreeNode newRoot = new TreeNode(val);
    newRoot.left = root;
    return newRoot;
}

接下來便開始處理 depth 大于 1 的情況枪萄,我們還是套用二叉樹 BFS 代碼公式進行解答。使用一個隊列存儲遍歷的節(jié)點硬毕,并使用變量 layer 和 count 分別統(tǒng)計遍歷的層數(shù)和放入隊列的次數(shù)呻引。首先進行初始化將根節(jié)點放入隊列中,因為根節(jié)點入隊因此此時 count 為 1吐咳,并且根據(jù)題目要求 layer 層數(shù)也是 1 逻悠。當放入隊列次數(shù)等于隊列大小的時候,表示一層已經(jīng)遍歷完了韭脊,此時層數(shù)加 1童谒,并且讓 count 歸零,代碼如下:

if (queue.size() == count) {
    layer++;
    count = 0;
}

這個時候我們從隊列中拿出第一個節(jié)點沪羔,此時判斷層數(shù) layer 是否等于 depth饥伊,如果不相等則將彈出節(jié)點的左右節(jié)點入棧;如果相等蔫饰,那么就需要使用 val 新建兩個節(jié)點琅豆,然后讓彈出節(jié)點的左右子樹指向新建節(jié)點,并且按照題目要求原來的左子樹應該是新的左子樹根的左子樹篓吁,右子樹應該是新的右子樹根的右子樹茫因,代碼如下:

if (layer == depth) {
    TreeNode leftNode = new TreeNode(val);
    TreeNode rightNode = new TreeNode(val);
    leftNode.left = poll.left;
    poll.left = leftNode;
    rightNode.right = poll.right;
    poll.right = rightNode;
}

需要注意的是我們需要在二叉樹的一層插入,所以上面的插入執(zhí)行完成之后不能夠退出循環(huán)杖剪,因為不能夠保證這一層是否遍歷完成冻押,只有當層數(shù) layer 大于 depth 的時候我們便可以退出循環(huán)結(jié)果返回根節(jié)點。

2.2 代碼

class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        // 在根節(jié)點插入上一層
        if (depth == 1) {
            TreeNode newRoot = new TreeNode(val);
            newRoot.left = root;
            return newRoot;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        int layer = 1;
        int count = 1;
        queue.offer(root);
        while (!queue.isEmpty()) {
            // queue.size() == count 時表示一層已經(jīng)遍歷完成盛嘿,遍歷完一層時層數(shù)加一洛巢,并且count歸零
            if (queue.size() == count) {
                layer++;
                count = 0;
            }
            TreeNode poll = queue.poll();
            // 插入新節(jié)點
            if (layer == depth) {
                TreeNode leftNode = new TreeNode(val);
                TreeNode rightNode = new TreeNode(val);
                leftNode.left = poll.left;
                poll.left = leftNode;
                rightNode.right = poll.right;
                poll.right = rightNode;
            }
            // 層數(shù)大于 depth 時退出循環(huán)
            if (layer > depth) {
                break;
            }
            if (poll.left != null) {
                queue.offer(poll.left);
                count++;
            }
            if (poll.right != null) {
                queue.offer(poll.right);
                count++;
            }
        }
        return root;
    }
}

2.3 測試結(jié)果

通過測試

測試結(jié)果

3.總結(jié)

  • 使用二叉樹 BFS 進行解答
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市次兆,隨后出現(xiàn)的幾起案子稿茉,更是在濱河造成了極大的恐慌,老刑警劉巖芥炭,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狈邑,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚤认,警方通過查閱死者的電腦和手機米苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砰琢,“玉大人蘸嘶,你說我怎么就攤上這事良瞧。” “怎么了训唱?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵褥蚯,是天一觀的道長。 經(jīng)常有香客問我况增,道長赞庶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任澳骤,我火速辦了婚禮歧强,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘为肮。我一直安慰自己摊册,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布颊艳。 她就那樣靜靜地躺著茅特,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棋枕。 梳的紋絲不亂的頭發(fā)上白修,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音重斑,去河邊找鬼兵睛。 笑死,一個胖子當著我的面吹牛绸狐,可吹牛的內(nèi)容都是我干的卤恳。 我是一名探鬼主播累盗,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼寒矿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了若债?” 一聲冷哼從身側(cè)響起符相,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蠢琳,沒想到半個月后啊终,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡傲须,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年蓝牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泰讽。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡例衍,死狀恐怖昔期,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佛玄,我是刑警寧澤硼一,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站梦抢,受9級特大地震影響般贼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奥吩,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一哼蛆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圈驼,春花似錦人芽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至靴迫,卻和暖如春惕味,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玉锌。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工名挥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人主守。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓禀倔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親参淫。 傳聞我的和親對象是個殘疾皇子救湖,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容