目录
1.前序遍历
思路:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
TreeNode* cur=root;
while(cur||!st.empty())
{
//走完左路径的节点,同时入栈
while(cur)
{
v.push_back(cur->val);
st.push(cur);
cur=cur->left;
}
//依次按栈中的节点,访问右子树
cur=st.top()->right;
st.pop();
}
return v;
}
};
2.中序遍历
思路:前序遍历简单变一下,不赘述
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
TreeNode* cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
cur=st.top()->right;
v.push_back(st.top()->val);
st.pop();
}
return v;
}
};
3.后序遍历
思想:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
TreeNode* cur=root;
TreeNode* prev=nullptr;
while(cur||!st.empty())
{
//做路径节点,同是入栈
while(cur)
{
st.push(cur);
cur=cur->left;
}
TreeNode* top=st.top();
//走到这节点左子树为空,如果有子树为空或者节点的右孩子为上一个访问的节点,那么可以访问
if(top->right==nullptr||top->right==prev)
{
v.push_back(top->val);
st.pop();
prev=top;
}
else
{
cur=top->right;
}
}
return v;
}
};