递归版本:
void _PostOrderR(Node<T>* pRoot)
{
//递归出口
if (NULL == pRoot)
return;
//遍历左子树
_PostOrderR(pRoot->LC);
//遍历右子树
_PostOrderR(pRoot->RC);
cout << pRoot->data << " ";
}
非递归版本:
void _PostOrderNor2(Node* pRoot)
{
if (NULL == pRoot)
return;
stack<Node<T>*> s;//利用栈结构进行辅助
Node *pCur = pRoot;
Node *prev = NULL;
Node *pTop = NULL;
while (!s.empty() || pCur)
{
//进行遍历,一直保存左结点
while (pCur)
{
s.push(pCur);
//左结点存在,将左结点入栈
pCur = pCur->LC;
}
pTop = s.top();
//如果栈顶元素不存在右节点,或者它的右节点已经被访问,那么对该结点进行访问,并将该节点出栈
if (NULL == pTop->RC || pTop->RC == prev)
{
cout << pTop->data << " ";
prev = pTop;
s.pop();
}
//如果存在右节点,或者右节点没有被访问,那么以该节点为根进行遍历保存左结点
else
pCur = pTop->RC;
}
cout << endl;
}
例图: