算法訓練第十六天|104.二叉樹的最大深度迹卢、111.二叉樹的最小深度、222.完全二叉樹的節(jié)點個數(shù)

二叉樹|104.二叉樹的最大深度绞绒、111.二叉樹的最小深度婶希、222.完全二叉樹的節(jié)點個數(shù)


104.二叉樹的最大深度

自己審題思路

使用層序遍歷計算最大深度(有多少層就有多深)

看完代碼隨想錄題解后的收獲

遞歸算法學習

代碼(迭代--層序遍歷):
class solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int depth = 0;
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()) {
            int size = que.size();
            depth++; // 記錄深度
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return depth;
    }
};
代碼(遞歸):
class solution {
public:
    int getdepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftdepth = getdepth(node->left);       // 左
        int rightdepth = getdepth(node->right);     // 右
        int depth = 1 + max(leftdepth, rightdepth); // 中
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getdepth(root);
    }
};

參考詳解


111.二叉樹的最小深度

自己審題思路

使用層序遍歷榕暇,在判斷當前節(jié)點沒有左右孩子后返回蓬衡。

看完代碼隨想錄題解后的收獲

遞歸思路的學習。

代碼(迭代--層序遍歷):
class Solution {
public:

    int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int depth = 0;
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()) {
            int size = que.size();
            depth++; // 記錄最小深度
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
                if (!node->left && !node->right) { // 當左右孩子都為空的時候彤枢,說明是最低點的一層了狰晚,退出
                    return depth;
                }
            }
        }
        return depth;
    }
};
代碼(遞歸):
class Solution {
public:
    int getDepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftDepth = getDepth(node->left);           // 左
        int rightDepth = getDepth(node->right);         // 右
                                                        // 中
        // 當一個左子樹為空,右不為空缴啡,這時并不是最低點
        if (node->left == NULL && node->right != NULL) { 
            return 1 + rightDepth;
        }   
        // 當一個右子樹為空壁晒,左不為空,這時并不是最低點
        if (node->left != NULL && node->right == NULL) { 
            return 1 + leftDepth;
        }
        int result = 1 + min(leftDepth, rightDepth);
        return result;
    }

    int minDepth(TreeNode* root) {
        return getDepth(root);
    }
};

參考詳解


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

自己審題思路

使用二叉樹遍歷业栅,遍歷到一個節(jié)點就++秒咐;

看完代碼隨想錄題解后的收獲

使用完全二叉樹的特性來優(yōu)化算法谬晕;

代碼(迭代)
class Solution {
public:
    int countNodes(TreeNode* root) {
        queue<TreeNode*> que;
        if (root != NULL) que.push(root);
        int result = 0;
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                result++;   // 記錄節(jié)點數(shù)量
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return result;
    }
};
代碼(遞歸)
// 版本一
class Solution {
private:
    int getNodesNum(TreeNode* cur) {
        if (cur == NULL) return 0;
        int leftNum = getNodesNum(cur->left);      // 左
        int rightNum = getNodesNum(cur->right);    // 右
        int treeNum = leftNum + rightNum + 1;      // 中
        return treeNum;
    }
public:
    int countNodes(TreeNode* root) {
        return getNodesNum(root);
    }
};

// 版本二
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == NULL) return 0;
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
};
代碼(利用完全二叉樹特性):
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == nullptr) return 0;
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        int leftDepth = 0, rightDepth = 0; // 這里初始為0是有目的的,為了下面求指數(shù)方便
        while (left) {  // 求左子樹深度
            left = left->left;
            leftDepth++;
        }
        while (right) { // 求右子樹深度
            right = right->right;
            rightDepth++;
        }
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1; // 注意(2<<1) 相當于2^2携取,所以leftDepth初始為0
        }
        return countNodes(root->left) + countNodes(root->right) + 1;
    }
};

上述算法時間復雜度為logN*logN 時間復雜度計算

參考詳解


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末攒钳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雷滋,更是在濱河造成了極大的恐慌不撑,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晤斩,死亡現(xiàn)場離奇詭異焕檬,居然都是意外死亡,警方通過查閱死者的電腦和手機澳泵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門实愚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兔辅,你說我怎么就攤上這事爆侣。” “怎么了幢妄?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵兔仰,是天一觀的道長。 經(jīng)常有香客問我蕉鸳,道長乎赴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任潮尝,我火速辦了婚禮榕吼,結果婚禮上,老公的妹妹穿的比我還像新娘勉失。我一直安慰自己羹蚣,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布乱凿。 她就那樣靜靜地躺著顽素,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徒蟆。 梳的紋絲不亂的頭發(fā)上胁出,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音段审,去河邊找鬼全蝶。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的抑淫。 我是一名探鬼主播绷落,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼始苇!你這毒婦竟也來了嘱函?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤埂蕊,失蹤者是張志新(化名)和其女友劉穎往弓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蓄氧,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡函似,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喉童。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撇寞。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堂氯,靈堂內的尸體忽然破棺而出蔑担,到底是詐尸還是另有隱情,我是刑警寧澤咽白,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布啤握,位于F島的核電站,受9級特大地震影響晶框,放射性物質發(fā)生泄漏排抬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一授段、第九天 我趴在偏房一處隱蔽的房頂上張望蹲蒲。 院中可真熱鬧,春花似錦侵贵、人聲如沸届搁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卡睦。三九已至,卻和暖如春蔫骂,著一層夾襖步出監(jiān)牢的瞬間么翰,已是汗流浹背牺汤。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工辽旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓补胚,卻偏偏與公主長得像码耐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溶其,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容