思路:都用到栈,用栈来存储结点
//先序非递归,根左右,循环处理,先打印根再压左子树,再压右子树
void PreOrder_Nor(BinaryTreeNode<T>* pRoot)
{
if(pRoot == NULL)
return ;
stack<BinaryTreeNode<T>*> s;
s.push(pRoot);
while(!s.empty())
{
BinaryTreeNode<T>* pCur = s.top();
cout<<pCur -> data << " ";
s.pop();
if(pCur -> left)
s.push(pCur->left);
if(pCur -> right)
s.push(pCur -> right);
}
}
//中序非递归,左根右,一样是循环,这次要一直压入左,然后逐个向上遍历根和右
void InOrder_Nor(BinaryTreeNode<T>* pRoot)
{
if(pRoot == NULL)
return ;
stack<BinaryTreeNode<T>*>s;
BinaryTreeNode<T>* pCur = pRoot;
while(pCur != NULL || !s.empty() )
{
while(pCur)
{
s.push(pCur);
pCur = pCur -> left;
}
BinaryTreeNode<T>* pTop = s.top();
cout<< pTop -> data << " ";
s.pop();
pCur = pTop -> right;
}
}
//后序遍历非递归
//左右根,当右为空或者右子树遍历完的时候才会遍历根节点,所以这里需要新给一个pRev结点。
void PostOrder_Nor(BinaryTreeNode<T>* pRoot)
{
if(pRoot == NULL)
return ;
stack<BinaryTreeNode<T>*>s;
BinaryTreeNode<T>* pRev = NULL;
BinaryTreeNode<T>* pCur = pRoot;
while(NULL != pCur || !s.empty())
{
while(pCur)
{
s.push(pCur);
pCur = pCur -> left;
}
BinaryTreeNode<T>* pTop = s.top();
if(pTop -> right == NULL || pTop -> right == pRev)
{
cout<<pTop->data<< " ";
pRev = pTop;
s.pop();
}
else
pCur = pTop -> right;
}
}