一句话总结:借用栈,注意后序遍历确认右子树遍历后才能遍历根。
void preorderWithoutRecursion(BTNode* root)
{
if (NULL == root)
{
return;
}
BTNode* p = root;
stack<BTNode*> s;
while (!s.empty() || p)
{
if (p)
{
cout << p->data << " "; //root
s.push(p);
p = p->lchild; //left
}
else
{
p = s.top();
s.pop();
p = p->rchild; //right
}
}
}
void inorderWithoutRecursion(BTNode* root)
{
if (NULL == root)
{
return;
}
BTNode* p = root;
stack<BTNode*> s;
while (!s.empty() || p)
{
if (p)
{
s.push(p);
p = p->lchild; //left
}
else
{
p = s.top();
s.pop();
cout << p->data << " "; //root
p = p->rchild; //right
}
}
}
void postOrderWithoutRecursion(BTNode* root)
{
if (NULL == root)
{
return;
}
stack<BTNode*> s;
BTNode* pCur, *pLastVisit;
pCur = root;
pLastVisit = NULL;
while (pCur)
{
s.push(pCur);
pCur = pCur->lchild;
}
while (!s.empty())
{
pCur = s.top();
s.pop();
if (NULL == pCur->rchild || pCur->rchild == pLastVisit)
{
cout << pCur->data;
pLastVisit = pCur;
}
else
{
s.push(pCur);
pCur = pCur->rchild;
while (pCur)
{
s.push(pCur);
pCur = pCur->lchild;
}
}
}
}