在王道上学习的代码进行整理。
一、先序遍历
1、递归
void PreOrder(BTNode *T){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
2、非递归
void PreOrder(BTNode *T){
BTNode *Stack[100];
int top=-1;
BTNode* p;
if(T!=NULL){
Stack[++top]=T;
while(top!=-1){
p=Stack[top—-];
visit(p);
if(p->rchild!=NULL){
Stack[++top]=p->rchild;
}
if(p->lchild!=NULL){
Stack[++top]=p->lchild;
}
}
}
}
二、中序遍历
1、递归
void InOrder(BTNode *T){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
2、非递归
void InOrder(BTNode *T){
BTNode *Stack[100];
BTNode *p=T;
int top=-1;
while(p||top!=-1){
if(p){
Stack[++top]=p;
p=p->lchild;
}
else{
p=Stack[top—-];
visit(p);
p=p->rchild;
}
}
}
三、后序遍历
1、递归
void PostOrder(BTNode *T){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
2、非递归
void PostOrder(BTNode *T){
InitStack(Stack);
BTNode *p=T;
BTNode *r;
while(p||!isEmpty(Stack)){
if(p){
push(Stack,p);
p=p->lchild;
}
else{
GetTop(Stack,p);
if(p->rchild&&p->rchild!=r){
p=p->rchild;
push(Stack,p);
p=p->lchild;
}
else{
pop(Stack,p);
visit(p->data);
r=p;
p=NULL;
}
}
}
}