二叉树的先序递归:
void preorder(BiTree T){
if (T!=NULL){
visit(t);
preorder(T->lchild);
preorder(T->rchild);
}
}
二叉树的中序递归:
void preorder(BiTree T){
if (T!=NULL){
preorder(T->lchild);
visit(t);
preorder(T->rchild);
}
}
二叉树的后序递归:
void preorder(BiTree T){
if (T!=NULL){
preorder(T->lchild);
preorder(T->rchild);
visit(t);
}
}
二叉树先序非递归:
void preorder2(BiTree T){
initstack(s);
BiTree p=T;
while(p||Isempty(s)){
if(p){
push(s,p);
visit(p);
P=P->lchild;
}
else{
pop(s,p);
p=p->rchild;
}
}
}
二叉树中序非递归:
void inorder2(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;
}
}
}
二叉树后序非递归:
void postorder2(BiTree T){
initstack(s);
BiTree p=T;
r=NULL; //r表示记录上一个被访问的节点
while(p||Isempty(s)){
if(p){
push(s,p);
P=P->lchild;
}
else{
Gettop(s,p);
if(p->rchild && p->child != r){
p=p->rchild;
push(s,p);
p=p->lchild;
}
else{
pop(s,p);
visit(p);
r=p; //更新
p=NULL; //把p置为空,因为p被访问过
}
}
}
}
层次遍历:
void leveorder2(BiTree T){
initqueue(q);
BiTree p=T;
enqueue(q,p);
while(!Isempty(q)){
dequeue(q,p);
visit(p);
if(p->lchild != NULL)
enqueue(q,p->lchild);
if(p->rchild != NULL)
enqueue(q,p->rchild);
}
}