思路一:主要思想就是先将根结点压入栈,然后根结点出栈并访问根结点,而后依次将根结点的右孩子、左孩子入栈,直到栈为空为止。
代码(链栈等实现参见《二叉树的非递归中序遍历以及层序遍历实现》):
void PreOrder2(BTree T)
{
if(!T)
return;
LinkStack s;
InitStack(&s);
Push(&s,T);
for(;;)
{
BTree ptr = NULL;
ptr = Top(s);
cout<<"Node : "<<ptr->data<<endl;
Pop(&s,&ptr);
if(ptr->rChild)
Push(&s,ptr->rChild);
if(ptr->lChild)
Push(&s,ptr->lChild);
if(Isempty(s))
break;
}
Destroy(&s);
}
思路二:访问结点,结点压栈,访问左结点,左子树访问结束回退到父结点,访问右子树。结点出栈表示该结点的左子树已访问完。
代码:
void PreOrder3(BTree T)
{
LinkStack s;
InitStack(&s);
while(T || !(Isempty(s)))
{
if (T)
{
cout<<"Node : "<<T->data<<endl;
Push(&s,T);
T = T->lChild;
}
else
{
Pop(&s,&T);
T = T->rChild;
}
}
Destroy(&s);
}