1.非递归 先序遍历
//借助 栈 实现
void PreOrder(BiTree T){
Stack S;
InitStack(S);
BiTree *p=T; //指针值向根节点
push(S,p); //将头结点压入栈中
while(p||!IsEmpty(S)){
if(p!=NULL){ //若p不为空
printf("%d",p->data);
push(S,p); //入栈
p=p->lchild;//指向左孩子
}else { //若p为空
pop(S,p); //栈顶节点出栈,p接收栈顶节点
p=p->rchild; //指向右孩子
}
}
}
1.非递归 中序遍历
Void MidOrder(BiTree T){
Stack S;
InitStack(S);
if(T==NULL){return 0;} //若为空树,结束程序
BiTree *p=T;
while(p||!IsEmpty(S)){ //若p和栈不为空
if(p!=NULL){
push(S,p);
p=p->lchild;
} else{ //直到p为空
pop(S,p);
printf("%d",p->data);
p=p->rchild;
}
}
}
1.非递归 后序遍历
Void PostOrder(BiTree T){
Stack S;
InitStack(S);
BiNode *p=T;
BiNode *r=NULL; //记录上次遍历的节点
while(p||!IsEmpty(S)){
if(p!=NULL){
push(S,p);
p=p->lchild;
}
else{
GetTop(S,p);//p指向栈顶节点
if(p->rchild&&p->rchild!=r){ //当右孩子存在且右孩子未被遍历
p=p->rchild; //指向右孩子
}else{
pop(S,p); //当右孩子不存在或右孩子被遍历,栈顶元素出栈
printf("%d",p->data);
r=p; //r记录此次访问节点
p=NULL;//左右子树均处理完,p置空,否则会导致死循环
}
}
}
}