二叉树的迭代遍历指的是使用循环(迭代)的方法,而不是递归,来遍历二叉树的节点。迭代遍历通常需要使用辅助数据结构(如栈或队列)来帮助控制遍历的顺序。以下是几种常见的二叉树迭代遍历方法:
前序迭代遍历
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root != nullptr)
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
if (node->right)
st.push(node->right);
if (node->left)
st.push(node->left);
result.push_back(node->val);
}
return result;
}
};
后序迭代遍历
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == nullptr) return result;
st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->left) st.push(node->left);
if(node->right) st.push(node->right);
}
//reverse(result.begin(),result.end());
//reverse
stack<int> st1;
for (int i = 0; i < result.size();i++)
{
st1.push(result[i]);
}
for (int i = 0; i < result.size();i++)
{
result[i] = st1.top();
st1.pop();
}
return result;
}
};
中序迭代遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* node = root;
while(node != nullptr || !st.empty())
{
if(node != nullptr)
{
st.push(node);
node = node->left;
}else
{
node = st.top();
st.pop();
result.push_back(node->val);
node = node->right;
}
}
return result;
}
};