主要思路
非递归遍历二叉树的思路有很多,这里用到的思路有一个优点,前中后序遍历的思路大差不差。
我们这里用到的思路就一条,将任何一棵树分为两个部分:
1.左路节点
2.左路节点的右子树
前序
//前序
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
TreeNode* cur = root;
vector<int> v;
stack<TreeNode*> s;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
v.push_back(cur->val);
cur = cur->left;
}
TreeNode* top = s.top();
s.pop();
cur = top->right;
}
return v;
}
};
中序
//中序
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ret;
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur || !st.empty())
{
while (cur)
{
st.push(cur);
cur = cur->left;
}
TreeNode* top = st.top();
st.pop();
ret.push_back(top->val);
cur = top->right;
}
return ret;
}
};
后序
//后序
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> v;
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = nullptr;
while (cur || !st.empty())
{
while (cur)
{
st.push(cur);
cur = cur->left;
}
TreeNode* top = st.top();
if (top->right == nullptr || top->right == pre)
{
st.pop();
v.push_back(top->val);
pre = top;
}
else
{
cur = top->right;
}
}
return v;
}
};