代碼隨想錄算法訓(xùn)練營第十二天|LeetCode 110. 平衡二叉樹淘衙、 257. 二叉樹的所有路徑传藏、 404. 左葉子之和、 222. 完全二叉樹的節(jié)點個數(shù)

二叉樹的第三天彤守!

題目鏈接:110. 平衡二叉樹

狀態(tài):不會毯侦,只知道平衡二叉樹的含義,不知道如何用代碼去判斷遗增,所以看解析叫惊。

但看了解析之后我又覺得,其實好像用已有知識是能做的做修,知識點就在昨天的筆記里了:既然要求高度霍狰,那就是用后序遍歷。接下來就是確認(rèn)遞歸三部曲了:1. 參數(shù)就是當(dāng)前節(jié)點饰及,返回值是當(dāng)前節(jié)點的樹高蔗坯。這里需要注意一個小細(xì)節(jié),返回的樹高燎含,值有可能為-1宾濒,這一點在單層遞歸邏輯里會講述 2. 遞歸終止條件就是 遇到空節(jié)點時 就返回0,代表空節(jié)點的樹高為0屏箍。 3. 單層遞歸邏輯是判斷左子樹與右子樹的高度差绘梦,如果差值小于等于1,則返回該節(jié)點樹高赴魁;如果大于1卸奉,則返回-1表示此部分不為平衡二叉樹,因此隨著-1的層層返回颖御,最終整棵樹也不可能是平衡二叉樹榄棵。完整代碼如下:

class Solution { // Java
    public boolean isBalanced(TreeNode root) {
        return getHeight(root) != -1;
    }

    public int getHeight(TreeNode root){
        if(root == null) return 0;

        int leftHeight = getHeight(root.left);
        if(leftHeight == -1) return -1;
        int rightHeight = getHeight(root.right);
        if(rightHeight == -1) return -1;

        // If the height difference between the left and right subtrees is greater than 1, 
        // then we return -1, indicating that the tree is no longer balanced.
        if(Math.abs(leftHeight - rightHeight) > 1) return -1;
        return Math.max(leftHeight, rightHeight) + 1;
    }
}

復(fù)雜度分析:
時間復(fù)雜度:O(n). 因為每個節(jié)點會被訪問一次。
空間復(fù)雜度:O(h). 遞歸調(diào)用棧的深度取決于樹高h(yuǎn),而空間復(fù)雜度取決于遞歸調(diào)用棧的深度疹鳄。

題目鏈接:257. 二叉樹的所有路徑

狀態(tài):第一反應(yīng)是暴力法或者指針法拧略,第一反應(yīng)完全沒有二叉樹的方法,所以看解析瘪弓。

事實上這題是需要回溯操作的垫蛆,而遞歸和回溯本就是一家,所以本題很好腺怯。

  1. 遞歸函數(shù)參數(shù)以及返回值月褥。要傳入根節(jié)點,記錄每一條路徑的path和存放結(jié)果集的result瓢喉。所以不需要返回值
  2. 確定終止條件。與以往的if(cur == null){終止處理邏輯} 不同的是 我們遍歷到葉子節(jié)點即可舀透,而不用去遍歷到空節(jié)點栓票。因此正確寫法應(yīng)該是 if(cur.left == null && cur.right == null) {終止處理邏輯}
  3. 確定單層遞歸邏輯。遇到葉子節(jié)點愕够,我們就應(yīng)該記錄最后一個節(jié)點然后收集一個路徑走贪,接下來就是回溯了。具體代碼如下:注意遞歸和回溯是同時進(jìn)行的
class Solution { // Java
    /**
     * 遞歸法
     */
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();// 存最終的結(jié)果
        if (root == null) {
            return res;
        }
        List<Integer> paths = new ArrayList<>();// 作為結(jié)果中的路徑
        traversal(root, paths, res);
        return res;
    }

    private void traversal(TreeNode root, List<Integer> paths, List<String> res) {
        paths.add(root.val);// 前序遍歷惑芭,中
        // 遇到葉子結(jié)點
        if (root.left == null && root.right == null) {
            // 輸出
            StringBuilder sb = new StringBuilder();// StringBuilder用來拼接字符串坠狡,速度更快
            for (int i = 0; i < paths.size() - 1; i++) {
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() - 1));// 記錄最后一個節(jié)點
            res.add(sb.toString());// 收集一個路徑
            return;
        }
        // 遞歸和回溯是同時進(jìn)行,所以要放在同一個花括號里
        if (root.left != null) { // 左
            traversal(root.left, paths, res);
            paths.remove(paths.size() - 1);// 回溯
        }
        if (root.right != null) { // 右
            traversal(root.right, paths, res);
            paths.remove(paths.size() - 1);// 回溯
        }
    }
}

復(fù)雜度分析:
時間復(fù)雜度:O(n*h). 每個節(jié)點都要被訪問一次遂跟,同時每個葉子節(jié)點都要構(gòu)建一條從根節(jié)點到葉子節(jié)點的路徑逃沿,這個復(fù)雜度取決于樹高h(yuǎn),所以最壞情況是這是一顆平衡樹即高度為O(n) 幻锁,在此情況下時間復(fù)雜度為O(n^2)
空間復(fù)雜度:O(n). 還是取決于遞歸深度凯亮,也就是取決于樹高。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哄尔,一起剝皮案震驚了整個濱河市假消,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岭接,老刑警劉巖富拗,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸣戴,居然都是意外死亡啃沪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門葵擎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谅阿,“玉大人,你說我怎么就攤上這事∏┎停” “怎么了寓涨?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氯檐。 經(jīng)常有香客問我戒良,道長,這世上最難降的妖魔是什么冠摄? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任糯崎,我火速辦了婚禮,結(jié)果婚禮上河泳,老公的妹妹穿的比我還像新娘沃呢。我一直安慰自己,他們只是感情好拆挥,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布薄霜。 她就那樣靜靜地躺著,像睡著了一般纸兔。 火紅的嫁衣襯著肌膚如雪惰瓜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天汉矿,我揣著相機(jī)與錄音崎坊,去河邊找鬼。 笑死洲拇,一個胖子當(dāng)著我的面吹牛奈揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻待,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼打月,長吁一口氣:“原來是場噩夢啊……” “哼揭朝!你這毒婦竟也來了腥泥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤关斜,失蹤者是張志新(化名)和其女友劉穎迫淹,沒想到半個月后秘通,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡敛熬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年肺稀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(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
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留阎曹,地道東北人伪阶。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像处嫌,于是被迫代替她去往敵國和親栅贴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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