标签:top pop 记录 非递归 递归算法 线索二叉树 ISE 使用 先序
void PreOrder(BiTree T){
if(T != NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T-rchild);
}
}
void InOrder(BiTree T){
if(T != NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if(T != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
void PreOrderTraverse(BiTree T){
InitStack(S);
BiTree p=T;
while(p||!IsEmpty(S)){ //栈不空或p不空时循环
if(p){
visit(p);
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
p=p->rchild;
}
}
}
void InOrderTraverse(BiTree T){
InitStack(S);
BiTree p=T;
while(p||!IsEmpty(S)){
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
visit(p);
p=p->rchild;
}
}
}
后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根结点。
当用堆栈来存储结点时,必须分清楚返回根结点时是从左子树返回还是从右子树返回的。
所以,使用辅助指针r,其指向最近访问过的结点。也可在结点中增加一个标志域,记录是否已被访问。
void PostOrder(BiTree T){
InitStack(S);
p=T;
r=NULL;
while(p||!IsEmpty(S)){
if(p){
Push(S,p);
p=p->lchild;
}
else{
GetTop(S,p); //注意不是出栈,是取栈顶元素
if(p->rchild&&p->rchild!=r){ //若右子树存在,且未被访问过
p=p->rchild;
Push(S,p);
p=p->lchild;
}
else{ //右子树已经访问或为空,接下来出栈访问结点
Pop(S,p);
visit(p->data);
r=p;
p=NULL; //使p为空,从而继续访问栈顶
}
}
}
}
标签:top pop 记录 非递归 递归算法 线索二叉树 ISE 使用 先序
原文地址:https://www.cnblogs.com/lingyefengzi/p/11509417.html