代码随想录训练营打卡DAY 14 | 二叉树的DFS
递归遍历+迭代遍历
递归遍历应该问题不大,迭代遍历感觉很悬,基本上是抄卡哥的代码写出来的。
递归遍历需遵循三部曲:
- 确定递归函数的参数和返回值(不一定一开始就确定参数
- 确定终止条件
- 确定单程递归的逻辑
迭代法前序与后序写法一致,中序遍历不一样。也有三者风格一致的代码(未学)。
前序遍历【C++】:
// class Solution {
// public:
// // 递归三部曲
// // 1. 确定递归函数的参数和返回值(不一定一开始就确定参数
// // 2. 确定终止条件
// // 3. 确定单程递归的逻辑
// void traversal(TreeNode* cur, vector<int>& vec){
// if(!cur) return;
// vec.push_back(cur->val);
// traversal(cur->left, vec);
// traversal(cur->right, vec);
// }
// vector<int> preorderTraversal(TreeNode* root) {
// vector<int> result;
// traversal(root, result);
// return result;
// }
// };
class Solution{
public:
// 迭代法:用栈模拟,且空节点不入栈
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;// 存放节点指针,而不是TreeNode类型
vector<int> result;
if(root) st.push(root);
else return result;// 空节点不入栈
// 栈非空时循环
while (!st.empty())
{
TreeNode * cur = st.top();
result.push_back(cur->val); // 根
st.pop();
// 空节点不入栈,入栈时先右后左,出栈才是先左后右
if(cur->right) st.push(cur->right);// 右
if(cur->left) st.push(cur->left); // 左
}
return result;
}
};
后续遍历【C++】:
// class Solution {
// public:
// // 注意传入引用
// void traversal(TreeNode* cur, vector<int>& vec){
// if(!cur) return;
// traversal(cur->left, vec);
// traversal(cur->right, vec);
// vec.push_back(cur->val);
// }
// vector<int> postorderTraversal(TreeNode* root) {
// vector<int> result;
// traversal(root, result);
// return result;
// }
// };
class Solution{
public:
// 迭代法:用栈模拟,且空节点不入栈
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;// 存放节点指针,而不是TreeNode类型
vector<int> result;
if(root) st.push(root);
else return result;// 空节点不入栈
// 栈非空时循环
while (!st.empty())
{
TreeNode * cur = st.top();
result.push_back(cur->val); // 根
st.pop();
// 空节点不入栈,入栈时先右后左,出栈才是先左后右
if(cur->left) st.push(cur->left);// 右
if(cur->right) st.push(cur->right); // 左
}
reverse(result.begin(), result.end());
return result;
}
};
中序遍历【C++】:
// class Solution {
// public:
// // 迭代法
// vector<int> inorderTraversal(TreeNode* root) {
// stack<TreeNode*> st;
// vector<int> result;
// TreeNode* cur = root;
// while(!st.empty() || cur){
// if(cur){// 一直往左下
// st.push(cur);
// cur = cur->left; // 左
// }
// else{
// cur = st.top();
// st.pop();
// result.push_back(cur->val);// 根
// cur = cur->right; // 右
// }
// }
// return result;
// }
// };
class Solution{
public:
void traversal(TreeNode* cur, vector<int>& vec){
if(!cur) return;
traversal(cur->left, vec);
vec.push_back(cur->val);
traversal(cur->right, vec);
}
vector<int> inorderTraversal(TreeNode* root){
vector<int> result;
traversal(root, result);
return result;
}
};
参考文档
- https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
- https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html
- https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html
- https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E7%BB%9F%E4%B8%80%E8%BF%AD%E4%BB%A3%E6%B3%95.html