代碼隨想錄算法訓(xùn)練營(yíng)第19天-二叉樹(shù)

617. 合并二叉樹(shù)

你兩棵二叉樹(shù): root1 和 root2 。

想象一下垫桂,當(dāng)你將其中一棵覆蓋到另一棵之上時(shí)师幕,兩棵樹(shù)上的一些節(jié)點(diǎn)將會(huì)重疊(而另一些不會(huì))。你需要將這兩棵樹(shù)合并成一棵新二叉樹(shù)诬滩。合并的規(guī)則是:如果兩個(gè)節(jié)點(diǎn)重疊霹粥,那么將這兩個(gè)節(jié)點(diǎn)的值相加作為合并后節(jié)點(diǎn)的新值;否則疼鸟,不為 null 的節(jié)點(diǎn)將直接作為新二叉樹(shù)的節(jié)點(diǎn)后控。

返回合并后的二叉樹(shù)。

注意: 合并過(guò)程必須
merge.jpg

從兩個(gè)樹(shù)的根節(jié)點(diǎn)開(kāi)始空镜。
示例 1:
輸入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
輸出:[3,4,5,5,4,null,7]

class Solution {
public:
    //TreeNode* buildNewTrees(TreeNode* root1, TreeNode* root2)
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        //TreeNode* newNode = new TreeNode();
        if (root1 == nullptr && root2 == nullptr) return nullptr;
//這兩步是關(guān)鍵代碼
        if (root1 == nullptr) {
            return root2;
        }
        if (root2 == nullptr) {
            return root1;
        }
        root1->val = root1->val + root2->val;
        root1->left = mergeTrees(root1->left, root2->left);
        root1->right = mergeTrees(root1->right, root2->right);
        return root1;
    }
};

注意點(diǎn):

  1. 注意當(dāng)節(jié)點(diǎn)為空時(shí)浩淘,直接返回不為空的節(jié)點(diǎn)

700. 二叉搜索樹(shù)中的搜索

給定二叉搜索樹(shù)(BST)的根節(jié)點(diǎn) root 和一個(gè)整數(shù)值 val
你需要在 BST 中找到節(jié)點(diǎn)值等于 val 的節(jié)點(diǎn)姑裂。 返回以該節(jié)點(diǎn)為根的子樹(shù)馋袜。 如果節(jié)點(diǎn)不存在,則返回 null 舶斧。
示例 1:

tree1 (1).jpg

輸入:root = [4,2,7,1,3], val = 2
輸出:[2,1,3]

遞歸

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == nullptr) return root;
        if (root->val == val) return root;
        if (root->left == nullptr && root->right == nullptr) return nullptr;
        if (root->val < val) return searchBST(root->right, val);
        return searchBST(root->left, val);
    }
};

二叉樹(shù)遍歷

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while(!st.empty() || cur != nullptr) {
            if (cur != nullptr) {
                // 要先push再賦值欣鳖。要不然會(huì)把空值放到棧里頭
                st.push(cur);
                cur = cur->left;
            } else {
                cur = st.top();
                st.pop();
                if (cur->val == val) {
                    return cur;
                }
                cur = cur->right;
            }
        }
        return nullptr;
    }
};

注意點(diǎn):

1.看到搜索樹(shù),一般都先想到中序遍歷茴厉。中序遍歷只有一層循環(huán)T筇āJ踩佟!怀酷!沒(méi)有兩層
2.中序遍歷的結(jié)束條件要搞清楚 5九馈!
3.遍歷左樹(shù)的時(shí)候蜕依,一定要先push再賦值NΤ!要不然會(huì)有空值放在棧里頭Q摺友瘤!

迭代2

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while (root != NULL) {
            if (root->val > val) root = root->left;
            else if (root->val < val) root = root->right;
            else return root;
        }
        return NULL;
    }
};

注意點(diǎn):
1.也是利用二叉搜索樹(shù)的性質(zhì)

98. 驗(yàn)證二叉搜索樹(shù)

給你一個(gè)二叉樹(shù)的根節(jié)點(diǎn) root ,判斷其是否是一個(gè)有效的二叉搜索樹(shù)檐束。

注意點(diǎn):

1.還是中序遍歷二叉搜索樹(shù)
2.注意點(diǎn)同上辫秧。中序遍歷的循環(huán)結(jié)束條件,和push被丧、cur賦值先后順序

迭代

class Solution {
public:
    bool isValid(vector<int>& result) {
        if (result.size() <= 1) {
            return true;
        }
        for(int i = 0; i < result.size() - 1; i++) {
            if (result[i] >= result[i+1]) return false;
        }
        return true;
    }

    bool isValidBST(TreeNode* root) {
        if (root == nullptr) return true;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        vector<int> result;
        while (!st.empty() || cur != nullptr) {
            // 中序遍歷只有一次循環(huán)C讼贰!I稹柿究!不要嵌套兩次循環(huán)!8襦摇笛求!循環(huán)條件while和循環(huán)內(nèi)的判斷條件!糕簿!
            if (cur != nullptr) {
                st.push(cur);
                cur = cur->left;
            } else {
                cur = st.top();     
                st.pop();           
                result.emplace_back(cur->val);
                cur = cur->right;
            }
        }
        return isValid(result);
    }
};

遞歸

class Solution {
private:
    vector<int> vec;
    void traversal(TreeNode* root) {
        if (root == NULL) return;
        traversal(root->left);
        vec.push_back(root->val); // 將二叉搜索樹(shù)轉(zhuǎn)換為有序數(shù)組
        traversal(root->right);
    }
public:
    bool isValidBST(TreeNode* root) {
        vec.clear(); // 不加這句在leetcode上也可以過(guò)探入,但最好加上
        traversal(root);
        for (int i = 1; i < vec.size(); i++) {
            // 注意要小于等于,搜索樹(shù)里不能有相同元素
            if (vec[i] <= vec[i - 1]) return false;
        }
        return true;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懂诗,一起剝皮案震驚了整個(gè)濱河市蜂嗽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殃恒,老刑警劉巖植旧,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異离唐,居然都是意外死亡病附,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)亥鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)完沪,“玉大人,你說(shuō)我怎么就攤上這事「不” “怎么了听皿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宽档。 經(jīng)常有香客問(wèn)我尉姨,道長(zhǎng),這世上最難降的妖魔是什么吗冤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任又厉,我火速辦了婚禮,結(jié)果婚禮上欣孤,老公的妹妹穿的比我還像新娘馋没。我一直安慰自己,他們只是感情好降传,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勾怒,像睡著了一般婆排。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笔链,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天段只,我揣著相機(jī)與錄音,去河邊找鬼鉴扫。 笑死赞枕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坪创。 我是一名探鬼主播炕婶,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莱预!你這毒婦竟也來(lái)了柠掂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤依沮,失蹤者是張志新(化名)和其女友劉穎涯贞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體危喉,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋渔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辜限。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皇拣。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖列粪,靈堂內(nèi)的尸體忽然破棺而出审磁,到底是詐尸還是另有隱情谈飒,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布态蒂,位于F島的核電站杭措,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钾恢。R本人自食惡果不足惜手素,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘩蚪。 院中可真熱鬧泉懦,春花似錦、人聲如沸疹瘦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)言沐。三九已至邓嘹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間险胰,已是汗流浹背汹押。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留起便,地道東北人棚贾。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像榆综,于是被迫代替她去往敵國(guó)和親妙痹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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