算法訓(xùn)練第十八天|513.找樹(shù)左下角的值脏毯、112. 路徑總和、106.構(gòu)造二叉樹(shù)

二叉樹(shù)|513.找樹(shù)左下角的值幔崖、112. 路徑總和食店、106.構(gòu)造二叉樹(shù)


513.找樹(shù)左下角的值

自己審題思路

層序遍歷找最后一層第一個(gè)元素

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

遞歸法的學(xué)習(xí)

代碼:
class Solution {
public:
    int findBottomLeftValue(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();
                if (i == 0) result = node->val; // 記錄每一行第一個(gè)元素(循環(huán)覆蓋,最終記錄最后一行第一個(gè)元素)
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return result;
    }
};

代碼(遞歸)

class Solution {
public:
    int maxDepth = INT_MIN;
    int result;

    void traversal(TreeNode* cur, int depth) {
        if(!cur->left && !cur->right) {
            if(depth > maxDepth) {  
                maxDepth = depth;   // 更新最大深度
                result = cur->val;  // 最大深度最左面的數(shù)值
            }
            return;
        }

        if(cur->left) traversal(cur->left, depth + 1);
        if(cur->right) traversal(cur->right, depth + 1);
        return;
    }

    int findBottomLeftValue(TreeNode* root) {
        if(root == nullptr) return 0;
        traversal(root, 0);
        return result;
    }
};

參考詳解


112. 路徑總和

自己審題思路

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

遞歸函數(shù)什么時(shí)候要有返回值赏寇,什么時(shí)候沒(méi)有返回值(三點(diǎn))

  • 如果需要搜索整棵二叉樹(shù)且不用處理遞歸返回值吉嫩,遞歸函數(shù)就不要返回值。(113.路徑總和ii)
  • 如果需要搜索整棵二叉樹(shù)且需要處理遞歸返回值,遞歸函數(shù)就需要返回值。 (236. 二叉樹(shù)的最近公共祖先
  • 如果要搜索其中一條符合條件的路徑币呵,那么遞歸一定需要返回值平匈,因?yàn)橛龅椒蠗l件的路徑了就要及時(shí)返回。(本題的情況)
代碼:
class Solution {
public:
    bool traversal(TreeNode* cur, int count) {
        if(!cur->left && !cur->right && count == 0) return true;
        if(!cur->left && !cur->right) return false;

        if (cur->left) {
            if(traversal(cur->left,count - cur->left->val)) return true;
        }
        if (cur->right) {
            if(traversal(cur->right,count - cur->right->val)) return true;
        }
        return false;
    }

    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == nullptr) return false;
        return traversal(root,  targetSum - root->val);
    }
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool traversal(TreeNode* cur, int count) {
        if(!cur->left && !cur->right && count == cur->val) return true;
        if(!cur->left && !cur->right) return false;

        if (cur->left) {
            if(traversal(cur->left,count - cur->val)) return true;
        }
        if (cur->right) {
            if(traversal(cur->right,count - cur->val)) return true;
        }
        return false;
    }

    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == nullptr) return false;
        return traversal(root,  targetSum);
    }
};

參考詳解


構(gòu)造二叉樹(shù)

自己審題思路

這道題有思路:根據(jù)中序找到根節(jié)點(diǎn)窗骑,然后循環(huán)找,但是寫(xiě)代碼的時(shí)候遇到不少問(wèn)題。

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

理解思路和debug动漾。

代碼:
class Solution {
private:
    TreeNode* traversal (vector<int>& inorder, vector<int>& postorder) {
        if (postorder.size() == 0) return NULL;

        // 后序遍歷數(shù)組最后一個(gè)元素,就是當(dāng)前的中間節(jié)點(diǎn)
        int rootValue = postorder[postorder.size() - 1];
        TreeNode* root = new TreeNode(rootValue);

        // 葉子節(jié)點(diǎn)
        if (postorder.size() == 1) return root;

        // 找到中序遍歷的切割點(diǎn)
        int delimiterIndex;
        for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {
            if (inorder[delimiterIndex] == rootValue) break;
        }

        // 切割中序數(shù)組
        // 左閉右開(kāi)區(qū)間:[0, delimiterIndex)
        vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
        // [delimiterIndex + 1, end)
        vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() );

        // postorder 舍棄末尾元素
        postorder.resize(postorder.size() - 1);

        // 切割后序數(shù)組
        // 依然左閉右開(kāi)荠锭,注意這里使用了左中序數(shù)組大小作為切割點(diǎn)
        // [0, leftInorder.size)
        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
        // [leftInorder.size(), end)
        vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());

        root->left = traversal(leftInorder, leftPostorder);
        root->right = traversal(rightInorder, rightPostorder);

        return root;
    }
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (inorder.size() == 0 || postorder.size() == 0) return NULL;
        return traversal(inorder, postorder);
    }
};
class Solution {
public:
    TreeNode* dfs(vector<int>& inorder, int inStart, int inEnd, vector<int>& postorder, int postStart, int postEnd) {
        if(inStart == inEnd ) return nullptr;

        int rootValue = postorder[postEnd - 1];
        int split;
        for (int i = 0; i < inorder.size(); i++) {
            if (rootValue == inorder[i]) {
                split = i;
                break;
            }
        }
        TreeNode* root = new TreeNode(rootValue);
        int inLeftStart = inStart;
        int inLeftEnd = split;

        int inRightStart = split + 1;
        int inRightEnd = inEnd;

        int postLeftStart = postStart;
        int postLeftEnd = postLeftStart + (inLeftEnd - inLeftStart);

        int postRightStart = postLeftEnd;
        int postRightEnd = postEnd - 1;

        root->left = dfs(inorder, inLeftStart, inLeftEnd, postorder, postLeftStart, postLeftEnd);
        root->right = dfs(inorder, inRightStart, inRightEnd, postorder, postRightStart, postRightEnd);

        return root;
    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.size() == 0 || postorder.size() == 0) return nullptr;
        return dfs(inorder, 0, inorder.size(), postorder, 0, postorder.size());
    }
};

參考詳解


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旱眯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子证九,更是在濱河造成了極大的恐慌删豺,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧怜,死亡現(xiàn)場(chǎng)離奇詭異呀页,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拥坛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蓬蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尘分,“玉大人,你說(shuō)我怎么就攤上這事丸氛∨喑睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缓窜,是天一觀的道長(zhǎng)定续。 經(jīng)常有香客問(wèn)我,道長(zhǎng)禾锤,這世上最難降的妖魔是什么私股? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮恩掷,結(jié)果婚禮上倡鲸,老公的妹妹穿的比我還像新娘。我一直安慰自己螃成,他們只是感情好旦签,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著寸宏,像睡著了一般宁炫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮凝,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天羔巢,我揣著相機(jī)與錄音,去河邊找鬼罩阵。 笑死竿秆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稿壁。 我是一名探鬼主播幽钢,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼傅是!你這毒婦竟也來(lái)了匪燕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喧笔,失蹤者是張志新(化名)和其女友劉穎帽驯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體书闸,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尼变,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浆劲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌术。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哀澈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛉威,到底是詐尸還是另有隱情日丹,我是刑警寧澤走哺,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布蚯嫌,位于F島的核電站,受9級(jí)特大地震影響丙躏,放射性物質(zhì)發(fā)生泄漏择示。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一晒旅、第九天 我趴在偏房一處隱蔽的房頂上張望栅盲。 院中可真熱鬧,春花似錦废恋、人聲如沸谈秫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拟烫。三九已至,卻和暖如春迄本,著一層夾襖步出監(jiān)牢的瞬間硕淑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工嘉赎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留置媳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓公条,卻偏偏與公主長(zhǎng)得像拇囊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靶橱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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