LeetCode算法 | Day16 二叉樹:二叉樹的最大深度、N叉樹的最大深度棵里、二叉樹的最小深度润文、完全二叉樹的節(jié)點(diǎn)個數(shù)

104. 二叉樹的最大深度

題目:

給定一個二叉樹 root ,返回其最大深度殿怜。
二叉樹的 最大深度 是指從根節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的最長路徑上的節(jié)點(diǎn)數(shù)典蝌。
示例:


輸入:root = [3,9,20,null,null,15,7]
輸出:3

解題思路:

這道題可以用前序遍歷或者后序遍歷,前者求的是深度稳捆,后者求的是高度赠法。

  • 二叉樹節(jié)點(diǎn)的深度:指從根節(jié)點(diǎn)到該節(jié)點(diǎn)的最長簡單路徑邊的條數(shù)或者節(jié)點(diǎn)數(shù)(取決于深度從0開始還是從1開始)
    例如:深度從根節(jié)點(diǎn)開始應(yīng)該是1,2乔夯,3砖织。
  • 二叉樹節(jié)點(diǎn)的高度:指從該節(jié)點(diǎn)到葉子節(jié)點(diǎn)的最長簡單路徑邊的條數(shù)或者節(jié)點(diǎn)數(shù)(取決于高度從0開始還是從1開始)
    根節(jié)點(diǎn)的高度就是二叉樹的最大深度。
    例如:高度從根節(jié)點(diǎn)開始應(yīng)該是3末荐,2侧纯,1。
    遞歸的時候依然是三部曲:
  1. 確定遞歸函數(shù)的參數(shù)和返回值:參數(shù)就是傳入樹的根節(jié)點(diǎn)甲脏,返回就返回這棵樹的高度眶熬。
  2. 確定終止條件:如果為空節(jié)點(diǎn)的話妹笆,就返回0,表示高度為0娜氏。
  3. 確定單層遞歸的邏輯:先求它的左子樹的深度拳缠,再求右子樹的深度,最后取左右深度最大的數(shù)值再+1贸弥。
var maxDepth = function (root) {
    const getHeight = (node) => {
        if (!node) {
            return 0;
        }
        const leftHeight = getHeight(node.left);
        const rightHeight = getHeight(node.right);
        return leftHeight > rightHeight ? 1 + leftHeight : 1 + rightHeight;
    }
    const res = getHeight(root);
    return res;
};

559. N 叉樹的最大深度

題目:

給定一個 N 叉樹窟坐,找到其最大深度。
最大深度是指從根節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的最長路徑上的節(jié)點(diǎn)總數(shù)绵疲。
N 叉樹輸入按層序遍歷序列化表示哲鸳,每組子節(jié)點(diǎn)由空值分隔(請參見示例)。


輸入:root = [1,null,3,2,4,null,5,6]
輸出:3

解題思路:

整體思路和二叉樹是一致的盔憨,注意求子樹的高度的求法徙菠。

var maxDepth = function (root) {
    const getHeight = (node) => {
        if (!node) {
            return 0;
        }
        let height = 0;
        node.children.forEach((item) => {
            height = Math.max(height, getHeight(item));
        })
        return height + 1;
    }
    return getHeight(root);
};

111. 二叉樹的最小深度

題目:

給定一個二叉樹,找出其最小深度郁岩。
最小深度是從根節(jié)點(diǎn)到最近葉子節(jié)點(diǎn)的最短路徑上的節(jié)點(diǎn)數(shù)量婿奔。
說明:葉子節(jié)點(diǎn)是指沒有子節(jié)點(diǎn)的節(jié)點(diǎn)。
示例:


輸入:root = [3,9,20,null,null,15,7]
輸出:2

解題思路:

依舊是遞歸三部曲:

  1. 確定遞歸函數(shù)的參數(shù)和返回值:參數(shù)為要傳入的二叉樹根節(jié)點(diǎn)驯用,返回是高度脸秽。
  2. 確定終止條件:終止條件也是遇到空節(jié)點(diǎn)返回0,表示當(dāng)前節(jié)點(diǎn)的高度為0蝴乔。
  3. 確定單層遞歸的邏輯:
  • 如果左子樹為空,右子樹不為空驮樊,說明最小深度是 1 + 右子樹的深度薇正。
  • 如果右子樹為空,左子樹不為空囚衔,最小深度是 1 + 左子樹的深度挖腰。 - 如果左右子樹都不為空,返回左右子樹深度最小值 + 1 练湿。
var minDepth = function (root) {
    const getHeight = (node) => {
        if (!node) {
            return 0
        }
        const leftHeight = getHeight(node.left);
        const rightHeight = getHeight(node.right);
        if (node.left === null && node.right !== null) {
            return rightHeight + 1;
        }
        if (node.left !== null && node.right === null) {
            return leftHeight + 1;
        }
        return 1 + Math.min(leftHeight, rightHeight);
    }
    return getHeight(root);
};

222. 完全二叉樹的節(jié)點(diǎn)個數(shù)

題目:

給你一棵 完全二叉樹 的根節(jié)點(diǎn) root猴仑,求出該樹的節(jié)點(diǎn)個數(shù)。
完全二叉樹的定義如下:在完全二叉樹中肥哎,除了最底層節(jié)點(diǎn)可能沒填滿外辽俗,其余每層節(jié)點(diǎn)數(shù)都達(dá)到最大值,并且最下面一層的節(jié)點(diǎn)都集中在該層最左邊的若干位置篡诽。若最底層為第 h 層崖飘,則該層包含 1-2^h 個節(jié)點(diǎn)。
示例:

輸入:root = [1,2,3,4,5,6]
輸出:6

解題思路:

1. 按普通二叉樹處理

遞歸三部曲:

  1. 確定遞歸函數(shù)的參數(shù)和返回值:參數(shù)是樹的根節(jié)點(diǎn)杈女,返回以該節(jié)點(diǎn)為根節(jié)點(diǎn)二叉樹的節(jié)點(diǎn)數(shù)量朱浴。
  2. 確定終止條件:如果為空節(jié)點(diǎn)的話吊圾,就返回0,表示節(jié)點(diǎn)數(shù)為0翰蠢。
  3. 確定單層遞歸的邏輯:先求它的左子樹的節(jié)點(diǎn)數(shù)量项乒,再求右子樹的節(jié)點(diǎn)數(shù)量,最后取總和再加一就是目前節(jié)點(diǎn)為根節(jié)點(diǎn)的節(jié)點(diǎn)數(shù)量梁沧。
var countNodes = function (root) {
    const getNum = (node) => {
        if (!node) {
            return 0;
        }
        const leftNum = getNum(node.left);
        const rightNum = getNum(node.right);
        return 1 + leftNum + rightNum;
    }
    return getNum(root);
};

2. 利用完全二叉樹的特性

完全二叉樹只要里面可以找到很多的滿二叉樹檀何,這些二叉樹的節(jié)點(diǎn)數(shù)直接計(jì)算即可。
判斷滿二叉樹的方法:遞歸左右孩子趁尼,向左遞歸的深度等于向右遞歸的深度埃碱。
接下來就是按照遞歸三部曲來處理。

var countNodes = function (root) {
    const getNum = (node) => {
        if (!node) {
            return 0;
        }
        let left = node.left;
        let right = node.right;
        let leftDepth = 0;
        let rightDepth = 0;
        while (left) {
            leftDepth++;
            left = left.left;
        }
        while (right) {
            rightDepth++;
            right = right.right;
        }
        if (leftDepth === rightDepth) {
            return Math.pow(2, leftDepth + 1) - 1;
        }
        const leftNum = getNum(node.left);
        const rightNum = getNum(node.right);
        return leftNum + rightNum + 1;
    }
    return getNum(root);
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酥泞,一起剝皮案震驚了整個濱河市砚殿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芝囤,老刑警劉巖似炎,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悯姊,居然都是意外死亡羡藐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門悯许,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仆嗦,“玉大人,你說我怎么就攤上這事先壕〈穸螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵垃僚,是天一觀的道長集绰。 經(jīng)常有香客問我,道長谆棺,這世上最難降的妖魔是什么栽燕? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任宴凉,我火速辦了婚禮赤屋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擎厢。我一直安慰自己溅固,他們只是感情好付秕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侍郭,像睡著了一般询吴。 火紅的嫁衣襯著肌膚如雪掠河。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天猛计,我揣著相機(jī)與錄音唠摹,去河邊找鬼。 笑死奉瘤,一個胖子當(dāng)著我的面吹牛勾拉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盗温,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼藕赞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卖局?” 一聲冷哼從身側(cè)響起斧蜕,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砚偶,沒想到半個月后批销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡染坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年均芽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单鹿。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡掀宋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仲锄,到底是詐尸還是另有隱情布朦,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布昼窗,位于F島的核電站,受9級特大地震影響涛舍,放射性物質(zhì)發(fā)生泄漏澄惊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一富雅、第九天 我趴在偏房一處隱蔽的房頂上張望掸驱。 院中可真熱鬧,春花似錦没佑、人聲如沸毕贼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鬼癣。三九已至陶贼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間待秃,已是汗流浹背拜秧。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留章郁,地道東北人枉氮。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像暖庄,于是被迫代替她去往敵國和親聊替。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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