二叉树前中后序遍历递归法&迭代法
1.1. 前序遍历--递归
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
// 递归
vector<int> ans;
preTravel(root, ans);
return ans;
}
void preTravel(TreeNode* root, vector<int>& ans){
if(root == nullptr) return;
ans.push_back(root->val); // 根
preTravel(root->left, ans); // 左
preTravel(root->right, ans); // 右
}
};
1.2. 前序遍历--迭代
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
// 迭代
vector<int> ans;
if(root == nullptr) return ans;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
st.pop();
ans.push_back(cur->val); // 根
if(cur->right != nullptr) st.push(cur->right); // 右
if(cur->left != nullptr) st.push(cur->left); // 左 栈:先进后出,最后遍历结果是 根->左->右
}
return ans;
}
};
2.1. 中序遍历--递归
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
inTravel(root, ans);
return ans;
}
void inTravel(TreeNode* root, vector<int>& ans){
if(root == nullptr) return;
inTravel(root->left, ans); // 左
ans.push_back(root->val); // 根
inTravel(root->right, ans); // 右
}
};
2.2. 中序遍历--迭代
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
if(root == nullptr) return ans;
stack<TreeNode*> st;
TreeNode* cur = root;
while(cur != nullptr || !st.empty()){
while(cur != nullptr){
st.push(cur);
cur = cur->left;
}
cur = st.top();
st.pop();
ans.push_back(cur->val);
cur = cur->right;
}
return ans;
}
};
3.1. 后序遍历--递归
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
postTravel(root, ans);
return ans;
}
void postTravel(TreeNode* root, vector<int>& ans){
if(root == nullptr) return;
postTravel(root->left, ans); // 左
postTravel(root->right, ans); // 右
ans.push_back(root->val); // 根
}
};
3.2. 后序遍历--迭代
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
if(root == nullptr) return ans;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
st.pop();
ans.push_back(cur->val); // 根
if(cur->left != nullptr) st.push(cur->left); // 左
if(cur->right != nullptr) st.push(cur->right); // 右, 栈:先进后出,根->右->左
}
reverse(ans.begin(), ans.end()); // 左->右->根
return ans;
}
};

浙公网安备 33010602011771号