144.二叉树的前序遍历
初见想法:递归法非常简单,这里主要是想用非递归法来解决
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
if (root == nullptr) return ans;
st.push(root);
while (!st.empty())
{
TreeNode* node = st.top();
st.pop();
ans.push_back(node->val);
else continue;
if (node->right != nullptr) st.push(node->right);
if (node->left != nullptr) st.push(node->left);
}
return ans;
}
};
在非递归法中,使用stack模拟递归的过程,stack后进先出,而前序遍历的顺序为中左右,先遍历左边的,所以在stack的入栈过程中,应该先让右边的入栈。
145.二叉树的后序遍历
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
if (root == nullptr) return ans;
st.push(root);
while (!st.empty())
{
TreeNode* node = st.top();
st.pop();
ans.push_back(node->val);
if (node->left != nullptr) st.push(node->left);
if (node->right != nullptr) st.push(node->right);
}
reverse(ans.begin(), ans.end());
return ans;
}
};
二叉树的后序遍历和前序遍历非常相似,后序遍历的顺序为左右中,所以在代码中可以先中右左,然后reverse整个vector, 这样ans的顺序就是左右中。
94.二叉树的中序遍历
class Solution {
public:
vector<int> ans;
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> st;
TreeNode* curr = root;
while (!st.empty() || curr != nullptr)
{
if (curr != nullptr)
{
st.push(curr);
curr = curr->left;
}
else
{
TreeNode* node = st.top();
st.pop();
ans.push_back(node->val);
curr = node->right;
}
}
return ans;
}
};
二叉树的中序遍历,与前序后序不同的是,中序遍历多了一个指针指向了当前需要处理的节点,stack用来存储遍历过的节点