解题思路:
前序遍历 :辅助栈stack
1.访问左路节点中的元素,左路节点入栈
2.依次取栈中节点的右子树出来访问
3.以子问题的方式去访问右子树 (循环,迭代)
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> ans;
TreeNode* cur =root;
while(cur || !st.empty()) //cur指向哪个节点就表示开始前序访问这棵树
{
//1.访问左路节点,左路节点入栈
while(cur)
{
ans.push_back(cur->val);
st.push(cur);
cur = cur->left;
}
//2.依次取栈中节点的右子树出来访问
TreeNode* top = st.top();
st.pop();
//以子问题的方式去访问右子树
cur = top->right;
}
return ans;
}
};
中序遍历:辅助栈stack
1.左路节点入栈
2.依次取栈中左路节点,这时表示这个节点的左子树已经访问完了,
3.然后访问节点本身元素,再以子问题的形式去访问它的右子树。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
vector<int> ans;
TreeNode* cur = root;
while(cur || !st.empty()) //cur指向哪个节点就表示开始中序访问这棵树
{
//1.左路节点入栈
while(cur)
{
st.push(cur);
cur = cur->left;
}
//2.依次取栈中左路节点,这时表示这个节点的左子树已经访问完了。
//先访问节点本身,再以子问题的形式去访问它的右子树
TreeNode* top = st.top();
st.pop();
ans.push_back(top->val);
//以子问题的方式去访问右子树
cur = top->right;
}
return ans;
}
};
后序遍历:辅助栈stack
1.左路节点保存到栈
2.取到一个栈顶元素,他的左路节点已经访问完了, 如果它的右为空 ,或者右子树已经访问完了(如果上一个访问的节点是top的右子树),那么我们可以访问这个节点的元素了;如果右子树不为空,以子问题的方式访问右子树。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root)
{
stack<TreeNode*> st;
TreeNode* cur = root;
vector<int> ans;
TreeNode* prev = nullptr;
while(cur || !st.empty()) //cur指向哪个节点就表示开始中序访问这棵树
{
//1.左路节保存到栈
while(cur)
{
st.push(cur);
cur = cur->left;
}
//2. 取到一个栈顶元素,他的左路节点已经访问完了,
// 如果它的右为空 ,或者右子树已经访问完了(如果上一个访问的节点是top的右子树),那么我们可以访问这个节点的元素了。
TreeNode* top = st.top();
if(top->right == nullptr || top->right == prev)
{
st.pop();
ans.push_back(top->val);
prev = top;
}
else
{
cur = top->right;
}
}
return ans;
}
};