思路
使用栈模拟递归
前序遍历
题目链接:二叉树的前序遍历
顺序:中-左-右
栈具有先进后出的特点,应该先将根节点加入栈,再依次加入右节点和左节点,这样出栈的顺序就是先左节点后右节点了
代码
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> stk;
stk.push(root);
while (stk.size()) {
auto t = stk.top();
stk.pop();
if (!t) continue;
ans.push_back(t->val);
stk.push(t->right);
stk.push(t->left);
}
return ans;
}
中序遍历
题目链接:二叉树的中序遍历
顺序:左-中-右
尽可能的先将左子树加入栈中,在过程中存储其父节点,才能返回上一层,如果右节点存在,继续进行该操作
代码
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> stk;
TreeNode* cur = root;
while (stk.size() || cur) {
while (cur) {
stk.push(cur);
cur = cur->left;
}
auto t = stk.top();
stk.pop();
ans.push_back(t->val);
if (t->right)
cur = t->right;
}
return ans;
}
后序遍历
题目链接:二叉树的后序遍历
顺序:左-右-中
和前序遍历类似,先将其转化为中-右-左的顺序,即依次加入左节点和右节点,最后将结果翻转即可
代码
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> stk;
stk.push(root);
while (stk.size()) {
auto t = stk.top();
stk.pop();
if (!t) continue;
ans.push_back(t->val);
stk.push(t->left);
stk.push(t->right);
}
reverse(ans.begin(), ans.end());
return ans;
}