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,其指向最近访问过的结点。也可在结点中增长一个标志域,记录是否已被访问。html
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为空,从而继续访问栈顶 } } } }
原文出处:https://www.cnblogs.com/lingyefengzi/p/11509417.html算法