递归三部曲:
1.确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
2.确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
3.确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
前序遍历
#递归
class Solution {
public:
void traversal(TreeNode* root, vector<int> &result) {
if(root == nullptr) return;
result.emplace_back(root->val);
traversal(root->left, result);
traversal(root->right, result);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
#迭代
class Solution {
public:
void traversal(TreeNode* root, vector<int> &result) {
if(root == nullptr) return;
result.emplace_back(root->val);
traversal(root->left, result);
traversal(root->right, result);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
后序遍历
#递归
void traversal(TreeNode* root, vector<int>& result) {
if(root == nullptr) return;
traversal(root->left, result);
traversal(root->right, result);
result.emplace_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
#迭代
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if (root == nullptr) return result;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.emplace_back(node->val);
if(node->left)st.push(node->left);
if(node->right)st.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
中序遍历
#递归
void traversal(TreeNode* root, vector<int> &result) {
if(root == nullptr) return;
traversal(root->left, result);
result.emplace_back(root->val);
traversal(root->right, result);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
#迭代
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
if (root == nullptr) return result;
stack<TreeNode*> st;
TreeNode *cur = root;
while(!st.empty() || cur != nullptr) {
if (cur != nullptr) {
st.push(cur);
cur = cur->left;
} else {
cur = st.top();
st.pop();
result.emplace_back(cur->val);
cur = cur->right;
}
}
return result;
}