【二叉树】前、中、后序遍历的迭代写法
前序遍历
前序与后序代码几乎完全相同,唯一区别是入栈的顺序,前序入栈右左根,出栈为根左右,
后序入栈左右根,出栈为根右左,然后再反转一下就是后序遍历的左右根
class Solution {
public:
vector<int> res;
vector<int> preorderTraversal(TreeNode* root) {
if (!root) return res;
stack<TreeNode*> stk;
stk.push(root);
while (stk.size())
{
TreeNode* t = stk.top();
stk.pop();
res.push_back(t->val);//根最先入栈
//按右左顺序入栈,出栈时才是左右
if (t->right) stk.push(t->right);
if (t->left) stk.push(t->left);
}
return res;
}
};
后序遍历
class Solution {
public:
vector<int> res;
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
if (!root) return res;
stk.push(root);
while (stk.size())
{
TreeNode* t = stk.top();
stk.pop();
res.push_back(t->val);
if (t->left) stk.push(t->left);//本句及下句顺序与前序遍历相反
if (t->right) stk.push(t->right);
}
reverse(res.begin(), res.end());
return res;
}
};
中序遍历
中序与前后序不一样,需要先把左子树一直入栈,直到左下角,然后再遍历根节点,然后遍历右子树
class Solution {
public:
vector<int> res;
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
while (root || stk.size())
{
if (root)
{
stk.push(root);
root = root->left;
}
else
{
root = stk.top(); stk.pop();
res.push_back(root->val);
root = root->right;
}
}
return res;
}
};
分类:
二叉树
标签:
二叉树前、中、后序遍历的迭代写法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程