怎樣應(yīng)對(duì)IT面試與筆試-(十二)

專項(xiàng)練習(xí)

任何數(shù)據(jù)結(jié)構(gòu)與算法技巧的熟悉都需要我們一定題目量的訓(xùn)練馒吴。訓(xùn)練最終達(dá)到的目的是下意識(shí)的把我們見(jiàn)到的陌生的題目轉(zhuǎn)換為我們做過(guò)的題目類型。
我希望小伙伴們刻意的按照下面的步驟去思考:
(1)分析提取題目特征
(2)遍歷數(shù)據(jù)結(jié)構(gòu)世吨,先判斷哪幾種數(shù)據(jù)結(jié)構(gòu)與題目描述符合
(3)遍歷算法思想與技巧,看看原題目是否可以通過(guò)轉(zhuǎn)換變?yōu)槲覀兪煜さ念}目呻征。

二叉樹(shù)

二叉樹(shù)的非遞歸遍歷(先根序耘婚、中根序、后根序)

深度優(yōu)先遍歷的非遞歸實(shí)現(xiàn)一般都會(huì)借助棧怕犁,先根序與中根序的實(shí)現(xiàn)模式比較接近边篮,后根序稍微復(fù)雜一些。

144. Binary Tree Preorder Traversal 先根序遍歷

使用到的輔助數(shù)據(jù)結(jié)構(gòu):vector奏甫、stack
使用到的算法思想:深度優(yōu)先遍歷的非遞歸

//先根序遍歷
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> p;
        while(root || !p.empty())
        {
           //從根節(jié)點(diǎn)開(kāi)始遇到左子樹(shù)就開(kāi)始入棧戈轿,一直到葉子節(jié)點(diǎn)
            while(root)
            {
                p.push(root);
                result.push_back(root->val);
                root = root->left;
            }
            //彈出當(dāng)前結(jié)點(diǎn)
            root = p.top();
            p.pop();
            //開(kāi)始遍歷右子樹(shù)
            root = root->right;
        }
        return result;
    }
};

還是以左子樹(shù)的遍歷為例,流程入下:


144-非遞歸 (2).png

(1)左子樹(shù)一直入棧阵子,直到葉子結(jié)點(diǎn)
(2)4出棧
(3)4沒(méi)有右子樹(shù)思杯,2繼續(xù)出棧,2有右子樹(shù)5挠进,5沒(méi)有左子樹(shù)
(4)1出棧

94. Binary Tree Inorder Traversal 中根序遍歷

中根序遍歷使用到的數(shù)據(jù)結(jié)構(gòu)與算法思想與先根序一致色乾,所不同是root-value的放入時(shí)機(jī)

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
            vector<int> result;
        stack<TreeNode*> p;
        while(root || !p.empty())
        {
           //從根節(jié)點(diǎn)開(kāi)始遇到左子樹(shù)就開(kāi)始入棧,一直到葉子節(jié)點(diǎn)
            while(root)
            {
                p.push(root);
                root = root->left;
            }
            //彈出當(dāng)前結(jié)點(diǎn)
            root = p.top();
            p.pop();
            result.push_back(root->val);
            //開(kāi)始遍歷右子樹(shù)
            root = root->right;
        }
        return result;
    }
};

145. Binary Tree Postorder Traversal 后根序遍歷

后根序使用的數(shù)據(jù)結(jié)構(gòu)與算法仍舊與前序领突、中序相同暖璧,但程序結(jié)構(gòu)略有不同,原因是后根序需要在遍歷完左君旦、右子樹(shù)后再訪問(wèn)一次根結(jié)點(diǎn)澎办。所以需要額外保留一個(gè)指針變量記錄上次訪問(wèn)的結(jié)點(diǎn)。

先看代碼

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> p;
        TreeNode* root1 = root;
        TreeNode* preNode = nullptr;
        do
        {
          //同樣從根結(jié)點(diǎn)開(kāi)始一直把左子樹(shù)入棧金砍,直到葉子結(jié)點(diǎn)
            while(root1)
            {
                p.push(root1);
                root1 = root1->left;
            }
            //使用preNode 保留上次訪問(wèn)的結(jié)點(diǎn)局蚀,用來(lái)判斷當(dāng)前root結(jié)點(diǎn)是否是訪問(wèn)完右結(jié)點(diǎn)的root結(jié)點(diǎn)
            preNode = nullptr;
            while(!p.empty())
            {
                 root1 = p.top();
                 p.pop();
                //如果已經(jīng)訪問(wèn)完了右結(jié)點(diǎn),則當(dāng)前root結(jié)點(diǎn)可以放入result中
                 if(root1->right == preNode)
                 {
                     result.push_back(root1->val);
                     preNode = root1;
                 }
                //如果root結(jié)點(diǎn)沒(méi)有右結(jié)點(diǎn)或者還沒(méi)訪問(wèn)過(guò)右結(jié)點(diǎn)恕稠,則繼續(xù)入棧
                 else{
                     p.push(root1);
                     root1 = root1->right;
                     break;
                 }
            }
        }while(!p.empty());
        return result;
    }
};

以下面二叉樹(shù)中的245結(jié)點(diǎn)為例說(shuō)明上面程序流程琅绅,我們已經(jīng)以1為根結(jié)點(diǎn)已經(jīng)遍歷到了最左邊的葉子結(jié)點(diǎn)4

145-非遞歸 (2).png

102. Binary Tree Level Order Traversal 二叉樹(shù)的層序遍歷

使用到的輔助數(shù)據(jù)結(jié)構(gòu):vector、queue
使用到的算法思想:廣度優(yōu)先遍歷的非遞歸和遞歸

//遞歸
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int> > res;
        levelorder(root,0,res);
        return res;
    }
    void levelorder(TreeNode* root, int level, vector<vector<int> >& res)
    {
        if(!root)
            return;
        if(res.size() == level)
            res.push_back({});
        res[level].push_back(root->val);
        if(root->left)
            levelorder(root->left,level+1,res);
        if(root->right)
            levelorder(root->right,level+1,res);
    }
};
//非遞歸
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int> >res;
        if(root == NULL)
            return res;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            vector<int> oneLevel;
            int size = q.size();
            for(int i = 0; i <size; ++i)
            {
                TreeNode *node = q.front();
                q.pop();
                oneLevel.push_back(node->val);
                if(node->left)
                    q.push(node->left);
                if(node->right)
                    q.push(node->right);
            }
            res.push_back(oneLevel);
        }
        return res;
    }
};

怎樣應(yīng)對(duì)IT面試與筆試-(一)
怎樣應(yīng)對(duì)IT面試與筆試-(二)
怎樣應(yīng)對(duì)IT面試與筆試-(三)
怎樣應(yīng)對(duì)IT面試與筆試-(四)
怎樣應(yīng)對(duì)IT面試與筆試-(五)
怎樣應(yīng)對(duì)IT面試與筆試-(五-1)
怎樣應(yīng)對(duì)IT面試與筆試-(六)
怎樣應(yīng)對(duì)IT面試與筆試-(七)
怎樣應(yīng)對(duì)IT面試與筆試-(八)
怎樣應(yīng)對(duì)IT面試與筆試-(九)
怎樣應(yīng)對(duì)IT面試與筆試-(十)
怎樣應(yīng)對(duì)IT面試與筆試-(十一)
怎樣應(yīng)對(duì)IT面試與筆試-(十二)
怎樣應(yīng)對(duì)IT面試與筆試-(十三)
怎樣應(yīng)對(duì)IT面試與筆試-(十四)
怎樣應(yīng)對(duì)IT面試與筆試-(十五)
怎樣應(yīng)對(duì)IT面試與筆試-(十六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹅巍,一起剝皮案震驚了整個(gè)濱河市千扶,隨后出現(xiàn)的幾起案子料祠,更是在濱河造成了極大的恐慌,老刑警劉巖县貌,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件术陶,死亡現(xiàn)場(chǎng)離奇詭異凑懂,居然都是意外死亡煤痕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門接谨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摆碉,“玉大人,你說(shuō)我怎么就攤上這事脓豪∠锏郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵扫夜,是天一觀的道長(zhǎng)楞泼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)笤闯,這世上最難降的妖魔是什么堕阔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮颗味,結(jié)果婚禮上超陆,老公的妹妹穿的比我還像新娘。我一直安慰自己浦马,他們只是感情好时呀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晶默,像睡著了一般谨娜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磺陡,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天趴梢,我揣著相機(jī)與錄音,去河邊找鬼仅政。 笑死垢油,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圆丹。 我是一名探鬼主播滩愁,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辫封!你這毒婦竟也來(lái)了硝枉?” 一聲冷哼從身側(cè)響起廉丽,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妻味,沒(méi)想到半個(gè)月后正压,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡责球,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年焦履,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雏逾。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘉裤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栖博,到底是詐尸還是另有隱情屑宠,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布仇让,位于F島的核電站典奉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丧叽。R本人自食惡果不足惜卫玖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蠢正。 院中可真熱鬧骇笔,春花似錦、人聲如沸嚣崭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雹舀。三九已至芦劣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間说榆,已是汗流浹背虚吟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留签财,地道東北人串慰。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像唱蒸,于是被迫代替她去往敵國(guó)和親邦鲫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 題量有點(diǎn)多,建議Ctrl + F題號(hào)或題目哦~ 二叉樹(shù)的遍歷(前序遍歷庆捺,中序遍歷古今,后序遍歷)[144] Binar...
    野狗子嗷嗷嗷閱讀 9,103評(píng)論 2 37
  • 樹(shù) 記錄《劍指offer》中所有關(guān)于樹(shù)的題目,以及LeetCode中的相似題目滔以。 相關(guān)題目列表 題目 樹(shù)是一種最常...
    wenmingxing閱讀 1,420評(píng)論 2 13
  • 課程介紹 先修課:概率統(tǒng)計(jì)捉腥,程序設(shè)計(jì)實(shí)習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計(jì)你画,編譯原理抵碟,操作系統(tǒng),數(shù)據(jù)庫(kù)概論撬即,人...
    ShellyWhen閱讀 2,299評(píng)論 0 3
  • 如何搭建“我的世界”服務(wù)器 Java 11 發(fā)布線路圖:有哪些值得期待的新特性立磁? Airbnb 的核心日志系統(tǒng)C2...
    baitu閱讀 100評(píng)論 1 0
  • 黏性創(chuàng)意6大原則: 簡(jiǎn)單 simple : 精煉核心信息 意外 unexpected : 吸引維持注意 具體 c...
    杰盛閱讀 810評(píng)論 0 1