代碼隨想錄算法訓練營第十六天|LeetCode 235. 二叉搜索樹的最近公共祖先犀勒、701. 二叉搜索樹中的插入操作屎飘、 450. 刪除二叉搜索樹中的節(jié)點

二叉樹的第七天妥曲!

題目鏈接:235. 二叉搜索樹的最近公共祖先

狀態(tài):看視頻講解后一次性AC

利用二叉搜索樹的性質(zhì)可以很容易的尋找p與q的公共祖先的位置。所以如果用遞歸的方法的話钦购,就是遞歸三部曲:參數(shù)就是root檐盟, p, q三個節(jié)點押桃,其中在每次遞歸時葵萎,root傳入的都是當前層次的下一個節(jié)點,例如root.left或root.right。終止條件就是遞歸到root.val介于p.val與q.val之間羡忘。單層遞歸邏輯是如果root.val同時大于p.val和q.val谎痢,就向左節(jié)點遞歸;如果root.val同時小于p.val和q.val就向右節(jié)點遞歸卷雕。迭代法也是這個思路节猿。本題關鍵在于為什么滿足 root.val介于p.val與q.val之間 (這個條件) 的第一個節(jié)點就一定是最近公共祖先?這個這樣理解:root的值介于p q 之間漫雕,那p, q 一定是一個在root的左子樹滨嘱,另一個在root的右子樹中。所以無論往左或者往右再遞歸一層浸间,都不再是另一個節(jié)點的祖先太雨,(即錯過另外一個)完整代碼如下:

class Solution { // Java
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
        if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}

復雜度分析:
時間復雜度:O(h). h為樹高, 樹高決定遞歸深度
空間復雜度:O(h). h為樹高魁蒜, 同上

題目鏈接:701. 二叉搜索樹中的插入操作

狀態(tài):一次性AC

本題可能最難想的點就在于如何添加 或 在哪插入節(jié)點了囊扳,但是想清楚無論何種情況,都可以在葉子節(jié)點找到合適的位置添加元素兜看,這題就很簡單了宪拥。因為題目也沒說是添加之后要變成平衡二叉樹。
所以思路也很簡單铣减,根據(jù)數(shù)值的大小她君,利用二叉搜索樹的性質(zhì),一直遞歸到底層然后添加節(jié)點葫哗。
所以遞歸的方法中缔刹,參數(shù)就是節(jié)點root和添加的數(shù)值val。遞歸結(jié)束的條件就是找到空節(jié)點劣针。單層遞歸邏輯就是根據(jù)值的大小找尋正確的方向校镐,值比當前節(jié)點的值大就往右邊找,值比當前節(jié)點的值小就往左邊找捺典。完整代碼如下:

class Solution { // Java
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null) return new TreeNode(val);
        if(root.val < val){
            root.right = insertIntoBST(root.right, val);
        }else if(root.val > val){
            root.left = insertIntoBST(root.left, val);
        }
        return root;
    }
}

復雜度分析:
時間復雜度:O(h). h為樹高鸟廓, 樹高決定遞歸深度
空間復雜度:O(h). h為樹高, 同上

題目鏈接:450. 刪除二叉搜索樹中的節(jié)點

狀態(tài):看了教程襟己,跟著代碼敲引谜,才AC。還得細細琢磨

本題難點在于刪除節(jié)點會改變樹的結(jié)構(gòu)擎浴,因此得列舉出每一種情況才好應對员咽。教程里說一共是有五種情況:

  1. 沒找到刪除的節(jié)點,遍歷到空節(jié)點就直接返回了贮预。接下來都是找到刪除的節(jié)點的情況了:
  2. 左右孩子都為空贝室,直接刪除節(jié)點契讲,返回null給上一級
  3. 左孩子為空,右孩子不為空滑频,刪除節(jié)點后 右孩子補位捡偏,因此返回右孩子給上一級
  4. 右孩子為空,左孩子不為空峡迷,刪除節(jié)點后 左孩子補位霹琼,因此返回左孩子給上一級
  5. 左右孩子都不為空,則將刪除節(jié)點左子樹的頭節(jié)點放在 刪除節(jié)點 右子樹的最左邊節(jié)點上凉当,刪除節(jié)點的右孩子為新根節(jié)點枣申。
    完整代碼如下:情況二沒有在代碼里有所體現(xiàn)是因為 它被包含在了情況三四中,因為返回的無論是左節(jié)點還是右節(jié)點都是空看杭。
class Solution { // Java
  public TreeNode deleteNode(TreeNode root, int key) {
    if (root == null) return root; // 情況一:沒找到刪除的節(jié)點
    if (root.val == key) {
      if (root.left == null) { // 情況三:刪除節(jié)點的左孩子為空忠藤,右孩子不為空
        return root.right;
      } else if (root.right == null) { // 情況四:刪除節(jié)點的右孩子為空,左孩子不為空
        return root.left;
      } else { // 情況五:左右孩子節(jié)點都不為空
        TreeNode cur = root.right;
        while (cur.left != null) {
          cur = cur.left;
        }
        cur.left = root.left;
        root = root.right;
        return root;
      }
    }
    if (root.val > key) root.left = deleteNode(root.left, key); // 繼續(xù)在左子樹中查找
    if (root.val < key) root.right = deleteNode(root.right, key); // 繼續(xù)在右子樹中查找
    return root;
  }
}

復雜度分析:
時間復雜度:O(h). h為樹高楼雹, 樹高決定遞歸深度
空間復雜度:O(h). h為樹高模孩, 同上

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贮缅,隨后出現(xiàn)的幾起案子榨咐,更是在濱河造成了極大的恐慌,老刑警劉巖谴供,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块茁,死亡現(xiàn)場離奇詭異,居然都是意外死亡桂肌,警方通過查閱死者的電腦和手機数焊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崎场,“玉大人佩耳,你說我怎么就攤上這事√房纾” “怎么了干厚?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長螃宙。 經(jīng)常有香客問我蛮瞄,道長,這世上最難降的妖魔是什么污呼? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任裕坊,我火速辦了婚禮包竹,結(jié)果婚禮上燕酷,老公的妹妹穿的比我還像新娘籍凝。我一直安慰自己,他們只是感情好苗缩,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布饵蒂。 她就那樣靜靜地躺著,像睡著了一般酱讶。 火紅的嫁衣襯著肌膚如雪退盯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天泻肯,我揣著相機與錄音渊迁,去河邊找鬼。 笑死灶挟,一個胖子當著我的面吹牛琉朽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稚铣,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箱叁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惕医?” 一聲冷哼從身側(cè)響起耕漱,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罐柳,失蹤者是張志新(化名)和其女友劉穎芳悲,沒想到半個月后齿税,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挖函,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡省核,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年附帽,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓦糟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饱亿。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡椒楣,死狀恐怖给郊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捧灰,我是刑警寧澤淆九,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站毛俏,受9級特大地震影響炭庙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜煌寇,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一焕蹄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阀溶,春花似錦腻脏、人聲如沸鸦泳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽做鹰。三九已至,卻和暖如春鼎姐,著一層夾襖步出監(jiān)牢的瞬間钾麸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工炕桨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饭尝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓献宫,卻偏偏與公主長得像芋肠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遵蚜,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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