【二叉树】前、中、后序遍历的迭代写法
前序遍历
前序与后序代码几乎完全相同,唯一区别是入栈的顺序,前序入栈右左根,出栈为根左右,
后序入栈左右根,出栈为根右左,然后再反转一下就是后序遍历的左右根
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;
}
};

浙公网安备 33010602011771号