代碼隨想錄算法訓練營|第十四天|144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历。刷题心得(c++)

目录

讀題

自己看到题目的第一想法

看完代码随想录之后的想法

144.二叉树的前序遍历 - 實作

思路

Code

94.二叉树的中序遍历 - 實作

思路

Code

 145.二叉树的后序遍历 - 實作

思路

Code

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料


讀題

  • 144.二叉树的前序遍历
  • 145.二叉树的后序遍历
  • 94.二叉树的中序遍历

自己看到题目的第一想法

因為之前有用C語言遞迴寫過,但太久沒用加上第一次用C++,整體概念還是比較清晰的,但看到代碼隨想錄中,有三種寫法,並且有兩個不是遞迴,就感覺到自己還有很多東西要學。

看完代码随想录之后的想法

看完之後,遞迴的部分跟我之前的印象差不多,但卡爾有提到遞迴的三個步驟

  1. 確定要傳入函數的參數與返回值
  2. 設定終止條件
  3. 設定單遞迴要怎麼做

就把遞迴的部分講得很清楚,後續使用遞迴時也一套方式可以去嘗試代入,而不是靠直覺

但是在迭代法上,我是真的沒有想過有這樣子的解法,沒有想過Stack能夠這樣用,透過前序利用Stack先進後出的特性,先放入右子樹再放左子樹最後放入根結點,這樣就可以讓root被第一個放入,之後每次的循環都依靠這樣的邏輯,最後結束,後續則透過改變放入順序,最後再進行反轉,真的太令我驚訝了。

中序在迭代法上,則是將root先放入stack一路往左,並搭配空指針來遍歷節點,直到遇到空節點,開始進行將value,放入result當中,整體的思路還是需要再進行理解與統整。

在統一法上,則是利用NULL,來分清楚root在哪,來放入正確的節點。

看完這三個,其實我觀察下來關鍵就在root在哪,也就是中間的root,透過root不管是遞迴還是迭代法,其實就是中間節點在哪,決定我們要怎麼處理。

144.二叉树的前序遍历 - 實作

思路

  1. 建立一個函數,傳入root節點以及result數組
  2. 設定終止條件,假設cur=null 則return;
  3. 前序邏輯,
    1. 先放入中間 → result.push_back(cur→value);
    2. 再放入左邊 → if(cur→left) traver(cur→left);
    3. 再放入右邊 → if(cur→right)traver(cur→right);

Code

class Solution {
public:
    void Traversal(TreeNode* cur, vector& results) {
        if( cur == NULL ) return;
        results.push_back(cur->val);
        Traversal(cur->left, results);
        Traversal(cur->right, results);
    }
    vector preorderTraversal(TreeNode* root) {
        vector results;
        Traversal(root, results);
        return results;
    }
};

 

94.二叉树的中序遍历 - 實作

思路

  1. 建立一個函數,傳入root節點以及result數組
  2. 設定終止條件,假設cur=null 則return;
  3. 中序邏輯,
    1. 進入左邊 → if(cur→left) traver(cur→left);
    2. 放入中間值 → result.push_back(cur→value);
    3. 進入右邊 → if(cur→right)traver(cur→right);

Code

class Solution {
public:
    void Traversal(TreeNode* cur, vector& results) {
        if( cur == NULL ) return;
        Traversal(cur->left, results);
        results.push_back(cur->val);
        Traversal(cur->right, results);
    }
    vector inorderTraversal(TreeNode* root) {
        vector results;
        Traversal(root, results);
        return results;
    }
};

 

 145.二叉树的后序遍历 - 實作

思路

  1. 建立一個函數,傳入root節點以及result數組
  2. 設定終止條件,假設cur=null 則return;
  3. 後序邏輯,
    1. 進入左邊 → if(cur→left) traver(cur→left);
    2. 進入右邊 → if(cur→right)traver(cur→right);
    3. 放入中間值 → result.push_back(cur→value);

Code

class Solution {
public:
    void Traversal(TreeNode* cur, vector& results) {
        if( cur == NULL ) return;
        Traversal(cur->left, results);
        Traversal(cur->right, results);
        results.push_back(cur->val);
    }
    vector postorderTraversal(TreeNode* root) {
        vector results;
        Traversal(root, results);
        return results;
    }
};

總結

自己实现过程中遇到哪些困难

其實今天的實現過程中還是比較清晰的,至於迭代遍歷,我認為還需要花點時間來整理思緒,今天時間上比較緊,所以就先將遞迴的做法先複習一遍,所以沒有遇到太大的困難。

今日收获,记录一下自己的学习时长

大概學了1hr,時間比較緊

相關資料

理论基础

文章讲解:https://programmercarl.com/二叉树理论基础.html

题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的递归遍历.html

迭代遍历 

题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的迭代遍历.html

统一迭代 

题目链接/文章讲解:https://programmercarl.com/二叉树的统一迭代法.html

你可能感兴趣的:(算法,c++,leetcode,数据结构)