目录
讀題
自己看到题目的第一想法
看完代码随想录之后的想法
144.二叉树的前序遍历 - 實作
思路
Code
94.二叉树的中序遍历 - 實作
思路
Code
145.二叉树的后序遍历 - 實作
思路
Code
總結
自己实现过程中遇到哪些困难
今日收获,记录一下自己的学习时长
相關資料
因為之前有用C語言遞迴寫過,但太久沒用加上第一次用C++,整體概念還是比較清晰的,但看到代碼隨想錄中,有三種寫法,並且有兩個不是遞迴,就感覺到自己還有很多東西要學。
看完之後,遞迴的部分跟我之前的印象差不多,但卡爾有提到遞迴的三個步驟
就把遞迴的部分講得很清楚,後續使用遞迴時也一套方式可以去嘗試代入,而不是靠直覺
但是在迭代法上,我是真的沒有想過有這樣子的解法,沒有想過Stack能夠這樣用,透過前序利用Stack先進後出的特性,先放入右子樹再放左子樹最後放入根結點,這樣就可以讓root被第一個放入,之後每次的循環都依靠這樣的邏輯,最後結束,後續則透過改變放入順序,最後再進行反轉,真的太令我驚訝了。
中序在迭代法上,則是將root先放入stack一路往左,並搭配空指針來遍歷節點,直到遇到空節點,開始進行將value,放入result當中,整體的思路還是需要再進行理解與統整。
在統一法上,則是利用NULL,來分清楚root在哪,來放入正確的節點。
看完這三個,其實我觀察下來關鍵就在root在哪,也就是中間的root,透過root不管是遞迴還是迭代法,其實就是中間節點在哪,決定我們要怎麼處理。
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;
}
};
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;
}
};
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