代码随想录算法训练营Day14 | 二叉树的递归遍历 迭代遍历 统一迭代
递归遍历
题目链接:LeetCode 144 二叉树前序遍历
题目链接:LeetCode 145 二叉树后序遍历
题目链接:LeetCode 94 二叉树中序遍历
思路:
采用递归函数
前序遍历
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res){
if (!cur) return;
res.push_back(cur->val);
traversal(cur->left, res);
traversal(cur->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
//迭代法:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if (!root) return res;
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
res.push_back(node->val);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return res;
}
};
后序遍历
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res){
if(!cur) return;
traversal(cur->left, res);
traversal(cur->right, res);
res.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
//迭代法
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(!root) return res;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
st.pop();
res.push_back(cur->val);
if(cur->left) st.push(cur->left);
if(cur->right) st.push(cur->right);
}
reverse(res.begin(), res.end());
return res;
}
};
中序遍历
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res){
if(!cur) return;
traversal(cur->left, res);
res.push_back(cur->val);
traversal(cur->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
//迭代法
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if(!root) return res;
TreeNode* cur = root;
while(cur||!st.empty()){
if(cur){
st.push(cur);
cur=cur->left; //左;
}
else{
cur = st.top();
res.push_back(cur->val); // 中
st.pop();
cur = cur->right; //右
}
}
return res;
}
};
注意 :
- 前序中序后序分别取决于中间值cur的取值位置
- 迭代法前序注意left和right的顺序。先right后left
- 后序同前序,翻转即可