void Inoder(Bitree root)//二叉树的中序遍历非递归
{
IniStack(&S);//初始化一个栈
p=root;
while(!isEmpty(S)||p!=NULL)
{
if(p!=NULL)//如果当前结点不为空进栈
{
push(S,p);
p=p->left;//若该节点的左节点不为空,继续进栈
}
else//如果当前结点左节点为空出栈访问该节点右子树 或当前右节点为空出栈,此时为栈中保留的是该节点的前驱节点,继续访问右节点
{
pop(S,p);//出栈
visit(p);//访问该节点
p=p->right; //指向该节点右节点
}
}
}
void PostOrder(BiTree root)
{
BiTNode *p,*q;
Stack S;
q=NULL;//q是访问节点的右孩子
p=root;
InitStack(&S);
while(p!=NULL||isEmpty(S))
{
if(p!=NULL)
{
p=p->left;
}
else
{
Gettop(S,p);
if(p->right==NULL||p->right==q)
{
visit(p);
q=p;
pop(S,p);
p=NULL;
}
else p=p->right;
}
}
}
//表面上看递归算法好像没有调用栈,实际上递归算法的执行需要反复多次地调用自己,没调用一次,系统内部都有系统运行栈区
//在支持。需要保留本层参数,临时变量与返回地址等,随着函数递归调用,运行栈继续增长,直到函数执行完才能彻底释放占用的空间。
二叉树中序非递归遍历思路
p=root;
①如果栈不为空或者p不为空一直往左走 p=p->left
②如果p为空 出栈得到p节点,访问p,p=p->right。重复以上步骤
二叉树后序非递归思路
p=root;
①设计一个节点q用来保存访问的上一个节点
②如果栈不为空或者p不为空一直往左走p=p->left;
③如果p为空 取栈顶的值,如果栈顶值的右孩子等于NULL,或q,表明此节点的左右孩子都已访问,把p赋值为NULL继续退栈。如果栈顶的右孩子不等于NULL,或q,继续访问该节点的右孩子。重复以上步骤