二叉树的三种遍历方式(非递归)
//都是leetcode上的二叉树练习题,利用栈先进后出的特性用来标记根节点,然后进行一系列出栈入栈操作最终得到结果.
1.先序遍历
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> res;
TreeNode* cur = root;
stack<TreeNode*> st;
while(cur||!st.empty())
{
if(cur)
{
res.push_back(cur->val);
st.push(cur);
cur = cur->left;
}
else
{
cur = st.top();
st.pop();
cur = cur->right;
}
}
return res;
}
};
2.中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
TreeNode* cur = root;
stack<TreeNode*> st;
while(cur || !st.empty())
{
while(cur)
{
st.push(cur);
cur = cur->left;
}
cur = st.top();
res.push_back(cur->val);
st.pop();
cur = cur->right;
}
return res;
}
};
3.后序遍历
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode* p = root;
TreeNode* r = nullptr;
while(!s.empty() || p){
if(p){
s.push(p);
p = p->left;
}else{
p = s.top();
if(p->right == nullptr || p->right == r){
res.push_back(p->val);
s.pop();
r = p;
p = nullptr;
}else
p = p->right;
}
}
return res;
}