考研--二叉樹

1上陕、叉樹的層次遍歷

/**
 * 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:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        queue<TreeNode*> q;
        if(root) q.push(root);
        
        while(q.size())
        {
            vector<int> level;
            int len = q.size();
            for(int i = 0;i < len;i ++) {
                TreeNode* t = q.front();
                q.pop();
                level.push_back(t->val);
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
            }
            res.push_back(level);
        }
        
        return res;
    }
};

2桩砰、前序遍歷

遞歸
/**
 * 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:
    vector<int> res;
    void dfs(TreeNode* root) {
        if(root) {
            res.push_back(root->val);
            dfs(root->left);
            dfs(root->right);
        }
    }
    vector<int> preorderTraversal(TreeNode* root) {
        dfs(root);
        return res;
    }
};
迭代
/**
 * 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:
    
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        TreeNode* p = root;
        stack<TreeNode*> stk;
        while(p || stk.size())
        {
            while(p) {
                res.push_back(p->val);
                stk.push(p);
                p = p->left;
            }
            p = stk.top()->right;
            stk.pop();
        }
        return res;
    }
};

3、中序遍歷

遞歸
/**
 * 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:
    vector<int> res;
    void dfs(TreeNode* root)
    {
        if(root) {
            dfs(root->left);
            res.push_back(root->val);
            dfs(root->right);
        }
    }
    vector<int> inorderTraversal(TreeNode* root) {
        dfs(root);
        return res;
    }
};
迭代
/**
 * 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:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> stk;
        TreeNode* p = root;
        while(p || stk.size())
        {
            while(p) {
                stk.push(p);
                p = p->left;
            }
            p = stk.top();
            stk.pop();
            res.push_back(p->val);
            p = p->right;
        }
        return res;
    }
};

4释簿、后續(xù)遍歷

遞歸
/**
 * 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:
    vector<int> res;
    void dfs(TreeNode* root)
    {
        if(root)
        {
            dfs(root->left);
            dfs(root->right);
            res.push_back(root->val);
        }
    }
    vector<int> postorderTraversal(TreeNode* root) {
        dfs(root);
        return res;
    }
};
迭代

后續(xù)遍歷的做法如下:
1亚隅、前序遍歷的順序:根,左庶溶,右
2煮纵、可以根據(jù)類型前序遍歷的思想,遍歷出:根偏螺,右行疏,左
3、再通過 2 中遍歷出來的順序套像,通過反轉(zhuǎn)得到后序遍歷:左酿联,右,根

/**
 * 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:

    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode* > stk;
        TreeNode* p = root;
        while(p || stk.size())
        {
            while(p) {
                res.push_back(p->val);
                stk.push(p);
                p = p->right;
            }
            p = stk.top()->left;
            stk.pop();
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

5夺巩、前序遍歷 + 中序遍歷構(gòu)建二叉樹

/**
 * 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:
    unordered_map<int,  int> pos;
    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir)
    {
        if(pl > pr || il > ir) return NULL;
        TreeNode* root = new TreeNode(preorder[pl]);
        int k = pos[preorder[pl]];
        int len = k - il;
        root->left = build(preorder, inorder, pl + 1, pl + len, il, k - 1);
        root->right = build(preorder, inorder, pl + len + 1, pr, k + 1, ir);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        for(int i = 0 ;i < preorder.size();i ++) pos[inorder[i]] = i;
        return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
    }
};

6贞让、中序遍歷 + 后序遍歷構(gòu)建二叉樹

/**
 * 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:
    unordered_map<int, int> pos;
    TreeNode* build(vector<int> postorder, vector<int>& inorder, int pl, int pr, int il, int ir)
    {
        if(pl > pr || il > ir) return NULL;
        TreeNode* root = new TreeNode(postorder[pr]);
        int k = pos[postorder[pr]];
        int len = k - il;//len為前序的長(zhǎng)度
        root->left = build(postorder, inorder, pl, pl + len - 1, il, k - 1);
        root->right = build(postorder, inorder, pl + len, pr - 1, k + 1, ir);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        for(int i = 0;i < inorder.size();i ++) pos[inorder[i]] = i;
        return build(postorder, inorder, 0, postorder.size() - 1, 0, inorder.size() - 1);
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柳譬,隨后出現(xiàn)的幾起案子喳张,更是在濱河造成了極大的恐慌,老刑警劉巖美澳,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件销部,死亡現(xiàn)場(chǎng)離奇詭異摸航,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柴墩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門忙厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人江咳,你說我怎么就攤上這事「绶牛” “怎么了歼指?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)甥雕。 經(jīng)常有香客問我踩身,道長(zhǎng),這世上最難降的妖魔是什么社露? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任挟阻,我火速辦了婚禮,結(jié)果婚禮上峭弟,老公的妹妹穿的比我還像新娘附鸽。我一直安慰自己,他們只是感情好瞒瘸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布坷备。 她就那樣靜靜地躺著,像睡著了一般情臭。 火紅的嫁衣襯著肌膚如雪省撑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天俯在,我揣著相機(jī)與錄音竟秫,去河邊找鬼。 笑死跷乐,一個(gè)胖子當(dāng)著我的面吹牛肥败,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劈猿,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拙吉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了揪荣?” 一聲冷哼從身側(cè)響起筷黔,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仗颈,沒想到半個(gè)月后佛舱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椎例,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年请祖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了订歪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肆捕,死狀恐怖刷晋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慎陵,我是刑警寧澤眼虱,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站席纽,受9級(jí)特大地震影響捏悬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜润梯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一过牙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纺铭,春花似錦寇钉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顿痪,卻和暖如春镊辕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚁袭。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工征懈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揩悄。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓卖哎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親删性。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亏娜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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