中序遍历迭代算法(非递归算法)
关键:在二叉树的中序遍历中,访问结点的操作发生在左子树遍历完毕,准备遍历右子树时。所以在遇到某结点时并不能立即访问它,而是将它压入到栈中,等到左子树遍历完之后,再重栈中弹出并访问。
算法思想:遍历左子树,依次进栈(此时不访问),遍历完左子树之后弹出栈顶结点,访问栈顶结点,遍历右子树,依次循环操作直到栈为空和指针为空。
代码:
whille(p!=NULL||S.isEmpty){ //当p为空并且,S为空时跳出循环
if(p!=NULL){
push(S,p); //入栈
p=p->lchild; //遍历左子树
}
if(!S.isEmpty){
pop(S.p); //弹出栈顶元素
visit(p); //访问弹出结点
p=p->rchild; //遍历右子树
}
}
注意:这里pop(S.p) 与p=s.pop()一样