前序非递归遍历:
对于任一结点p:
a. 访问结点p,并将结点p入栈;
b. 判断结点p的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点p,循环置a;若不为空,则将p的左孩子置为当前结点p;
c. 直到p为空,并且栈为空,则遍历结束。
//前序非递归遍历
int NoPreOrderTraverse(BiTree t)
{
SqStack s;
InitStack(&s);
BiTree tmp = t;
if(tmp == NULL)
{
fprintf(stdout, "the tree is null.\n");
return ERROR;
}
//现将左子树压入栈,当到叶子结点后,出栈,获取右子树,然后在压入右子树的左子树。
//顺序不能变
while((tmp != NULL) || (IsEmpty(&s) != 1))
{
while(tmp != NULL)
{
Push(&s, tmp);
printf("%c ", tmp->data);
tmp = tmp->lchild;
}
if(IsEmpty(&s) != 1)
{
Pop(&s, &tmp);
tmp = tmp->rchild;
}
}
return OK;
}