二叉树的递归遍历(力扣刷题)
-
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
-
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
-
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
前序遍历:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
//递归法
// class Solution {
// public:
// void traversal(TreeNode* cur,vector<int>& vec)
// {
// if(cur == NULL) 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;
vector<int> result;
if(root == NULL)
{
return result;
}
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->right)
{
st.push(node->right);
}
if(node->left)
{
st.push(node->left);
}
}
return result;
}
};
中序遍历:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
//递归法
// class Solution
// {
// public:
// void traversal(TreeNode* cur, vector<int>& vec)
// {
// if (cur == NULL) 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;
// }
// };
//非递归法
class Solution
{
public:
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> result;
stack<TreeNode*> st;
TreeNode* cur = root;
while(cur != NULL || !st.empty())
{
//一直左遍历
if(cur != NULL)
{
st.push(cur);
cur = cur->left;
}
else //当左遍历到底时,出栈
{
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right; //判断是否有右元素
}
}
return result;
}
};
后序遍历:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
//递归法
// class Solution {
// public:
// void traversal(TreeNode* cur, vector<int>& vec)
// {
// if (cur == NULL) 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;
vector<int> result;
if(root == NULL)
{
return result;
}
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->left)
{
st.push(node->left);
}
if(node->right)
{
st.push(node->right);
}
}
reverse(result.begin(),result.end());
return result;
}
};
posted on 2023-04-11 10:58 会飞的鱼-blog 阅读(3) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现