二叉樹 LeetCode 刷題小結(jié)(七)

在上節(jié)的基礎(chǔ)上奸柬,本節(jié)我們將繼續(xù)匯總一些 LeetCode 有關(guān)二叉樹的題。



接著上節(jié)则酝,我們繼續(xù)匯總二叉樹相關(guān)的例題惠奸。
所有題均來自于leetcode

二叉樹剪枝

給定二叉樹根結(jié)點(diǎn) root 桨螺,此外樹的每個(gè)結(jié)點(diǎn)的值要么是 0宾符,要么是 1。

返回移除了所有不包含 1 的子樹的原二叉樹彭谁。

( 節(jié)點(diǎn) X 的子樹為 X 本身吸奴,以及所有 X 的后代。)

圖片.png
圖片.png

移除的條件是這個(gè)子樹含有0缠局,遞歸左右子樹则奥,如果滿足條件,對(duì)應(yīng)的指針域賦值為空即可狭园。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        if(fun(root)){
            return root;
        }else{
            return NULL;
        }
    }
    bool fun(TreeNode* tree){
        if(tree==NULL){
            return false;
        }
        bool l=fun(tree->left);
        bool r=fun(tree->right);
        if(!l){
            tree->left=NULL;
        }
        if(!r){
            tree->right=NULL;
        }
        return tree->val==1||l||r;
    }
};

最長同值路徑

給定一個(gè)二叉樹读处,找到最長的路徑,這個(gè)路徑中的每個(gè)節(jié)點(diǎn)具有相同值唱矛。 這條路徑可以經(jīng)過也可以不經(jīng)過根節(jié)點(diǎn)罚舱。

注意:兩個(gè)節(jié)點(diǎn)之間的路徑長度由它們之間的邊數(shù)表示。

圖片.png

在遞歸過程中绎谦,如果其左(右)子樹的節(jié)點(diǎn)域等于根節(jié)點(diǎn)的節(jié)點(diǎn)域管闷,說明這可能是一條路徑,遞歸左右子樹窃肠,同時(shí)記錄路徑長度包个。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int res;
    int longestUnivaluePath(TreeNode* root) {
        res=0;
        fun(root);
        return res;
    }
    int fun(TreeNode* root){
        if(root==NULL){
            return 0;
        }
        int l=fun(root->left);
        int r=fun(root->right);
        int ll=0,rr=0;
        if(root->left!=NULL && root->left->val==root->val){
            ll+=l+1;
        }
        if(root->right!=NULL && root->right->val==root->val){
            rr+=r+1;
        }
        res=max(res,rr+ll);
        return max(ll,rr);
    }
};

二叉樹最大寬度

給定一個(gè)二叉樹,編寫一個(gè)函數(shù)來獲取這個(gè)樹的最大寬度冤留。樹的寬度是所有層中的最大寬度碧囊。這個(gè)二叉樹與滿二叉樹(full binary tree)結(jié)構(gòu)相同,但一些節(jié)點(diǎn)為空纤怒。

每一層的寬度被定義為兩個(gè)端點(diǎn)(該層最左和最右的非空節(jié)點(diǎn)糯而,兩端點(diǎn)間的null節(jié)點(diǎn)也計(jì)入長度)之間的長度。

bfs做法泊窘,只不過稍微有一點(diǎn)點(diǎn)區(qū)別熄驼,我們需要使用雙端隊(duì)列像寒,入節(jié)點(diǎn)方式略有不同。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        int ans=0;
        if(!root){
            return ans;
        }
        TreeNode* tmp=nullptr;
        deque<TreeNode*> d;
        d.push_back(root);
        while(!d.empty()){
            //判斷隊(duì)列是否為空
            while(!d.empty() && !d.front()){
                d.pop_front();
            }
            while(!d.empty() && !d.back()){
                d.pop_back();
            }
            int n=d.size();
            if(!n){
                break;
            }
            ans=max(ans,n);
            while(n--){
                tmp=d.front();
                d.pop_front();
                d.push_back(tmp==NULL ? NULL:tmp->left);
                d.push_back(tmp==NULL ? NULL:tmp->right);
            }
        }
        
        return ans;
    }
};

根據(jù)二叉樹創(chuàng)建字符串

你需要采用前序遍歷的方式谜洽,將一個(gè)二叉樹轉(zhuǎn)換成一個(gè)由括號(hào)和整數(shù)組成的字符串萝映。

空節(jié)點(diǎn)則用一對(duì)空括號(hào) "()" 表示吴叶。而且你需要省略所有不影響字符串與原始二叉樹之間的一對(duì)一映射關(guān)系的空括號(hào)對(duì)阐虚。

圖片.png

本題需要考慮遞歸過程中左右子樹的處理情況,解決好這個(gè)問題蚌卤,就不難了实束。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    string tree2str(TreeNode* t) {
        if(!t){
            return "";
        }
        if(!t->left&&!t->right){
            return to_string(t->val) +"";
        }
        if(!t->right){
            return to_string(t->val)+"("+tree2str(t->left)+")";
        }
        return to_string(t->val)+"("+tree2str(t->left)+")("+tree2str(t->right)+")";
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逊彭,隨后出現(xiàn)的幾起案子咸灿,更是在濱河造成了極大的恐慌,老刑警劉巖侮叮,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件避矢,死亡現(xiàn)場離奇詭異,居然都是意外死亡囊榜,警方通過查閱死者的電腦和手機(jī)审胸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卸勺,“玉大人砂沛,你說我怎么就攤上這事∈锴螅” “怎么了碍庵?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悟狱。 經(jīng)常有香客問我静浴,道長,這世上最難降的妖魔是什么挤渐? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任苹享,我火速辦了婚禮,結(jié)果婚禮上挣菲,老公的妹妹穿的比我還像新娘富稻。我一直安慰自己,他們只是感情好白胀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布椭赋。 她就那樣靜靜地躺著,像睡著了一般或杠。 火紅的嫁衣襯著肌膚如雪哪怔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音胚委,去河邊找鬼。 笑死叉信,一個(gè)胖子當(dāng)著我的面吹牛亩冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硼身,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硅急,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佳遂?” 一聲冷哼從身側(cè)響起营袜,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丑罪,沒想到半個(gè)月后荚板,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吩屹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年跪另,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祟峦。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罚斗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宅楞,到底是詐尸還是另有隱情针姿,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布厌衙,位于F島的核電站距淫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏婶希。R本人自食惡果不足惜榕暇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喻杈。 院中可真熱鬧彤枢,春花似錦、人聲如沸筒饰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷们。三九已至业栅,卻和暖如春秒咐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碘裕。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工携取, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帮孔。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓雷滋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親你弦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惊豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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