前序非递归算法
void front(student *root)
{
student* p = root;
stack<student*>m;
while (p||!m.empty())
{
if (p)
{
cout << p->data;
m.push(p);
p = p->left;
}
else
{
p = m.top();
m.pop();
p = p->right;
}
}
}
大家自己在草稿本上随意画个图,然后自己顺着代码用笔模拟一下过程就行了。我觉得讲思路你也不一定看得进去,这是最有效的方法了。
中序非递归算法
void mid(student* root)
{
student* p = root;
stack<student*>m;
while (p || !m.empty())
{
if (p)
{
m.push(p);
p = p->left;
}
else
{
p = m.top();
cout << p->data;
m.pop();
p = p->right;
}
}
}
中序和先序遍历很像,只需要改变一下cout<<p->data的位置即可,具体为什么是这样,是因为二者入stack的顺序都是一样的,只不过输出的时候需要些许改变,但是后序的入stack就完全不一样,所以后序非递归的遍历的代码structure完全和前序中序不一样。
后序非递归算法
void last(student* root)
{
if (root == NULL)
{
return;
}
student* p = root;
student* last = root;
stack<student*>m;
m.push(p);
while (!m.empty())
{
p = m.top();
if ((p->left == NULL && p->right == NULL) || (p->right == NULL && last == p->left) || (last == p->right))
{
cout << p->data;
last = p;
m.pop();
}
else
{
if (p->right)
m.push(p->right);
if (p->left)
m.push(p->left);
}
}
}
后序是最难的,同学们要好好用笔画个图,然后按照代码逻辑模拟一遍,相信我 看不懂模拟2遍就懂了