关于二叉树前序遍历的非递归实现,大多如下,即教科书版
void previsit(TreeNode*root)
{
if (root == NULL)
return;
stack<TreeNode*> sta;
TreeNode*p = root;
while (p || !sta.empty())
{
while (p)
{
cout << p->val << endl;
sta.push(p);
p = p->left;
}
if (!sta.empty())
{
p = sta.top();
sta.pop();
p = p->right;
}
}
}
现有另一种实现方式:
vector<int> previsit(TreeNode *root)
{
vector<int> res;
if (!root)
return res;
stack<TreeNode *> st;
st.push(root);
while (st.size())
{
TreeNode *temp = st.top();
st.pop();
res.push_back(temp->val);
if (temp->right)
st.push(temp->right);
if (temp->left)
st.push(temp->left);
}
return res;
}
类似于层序遍历,但是用stack实现,实际添加、弹出的节点与层序遍历并不相同。可实现前序遍历。