二叉树的非递归遍历及其递归遍历算法
二叉树的结构定义是一个递归的定义,在树的定义中用到了树的概念。在二叉树的一些应用中,,常常需要通过遍历二叉树获取某些元素的属性。
一:递归遍历
1.递归先序遍历
/*递归先序遍历二叉树(DLR)*/
Status PreOrderTraverse(BiTree T, Status(*Visit)(TELemType e)){
if (T){
if (Visit(T->data)){
if (PreOrderTraverse(T->lchild, Visit)){
if (PreOrderTraverse(T->rchild, Visit))return OK;
}
}
return ERROR;
}
else return OK;
}
2.递归中序遍历
/*递归中序遍历二叉树*/
Status InOrderTraverse(BiTree T, Status(*Visit)(TELemType e)){
if (T){
if (InOrderTraverse(T->lchild, Visit)){
if (Visit(T->data)){
if (InOrderTraverse(T->rchild, Visit))return OK;
}
}
return ERROR;
}
else return OK;
}
3.递归后序遍历
/*递归后序遍历二叉树*/
Status PosOrderTraverse(BiTree T, Status(*Visit)(TELemType e)){
if (T){
if (PosOrderTraverse(T->lchild, Visit)){
if (PosOrderTraverse(T->rchild, Visit)){
if(Visit(T->data))return OK;
}
}
return ERROR;
}
else return OK;
}
二:非递归遍历(在非递归遍历中要用到栈的结构)
1.非递归先序遍历
/*非递归先序遍历二叉树*/
Status PreOrderTraverse1(BiTree T, Status(*Visit)(TELemType e)){
BiTree p;
Stack S;
InitStack(S);
p = T;
while (p != NULL || !StackEmpty(S)){
while (p != NULL){
Visit(p->data);
Push(S, p);
p = p->lchild;
}
if (!StackEmpty(S)){
Pop(S, p);
p = p->rchild;
}
}
return OK;
}
2.非递归中序遍历
/*非递归中序遍历*/
Status InOrderTraverse1(BiTree T, Status(*Visit)(TELemType e)){
BiTree p;
Stack S;
InitStack(S);
p = T;
while (p != NULL || !StackEmpty(S)){
while (p != NULL){
Push(S, p);
p = p->lchild;
}
if (!StackEmpty(S)){
Pop(S, p);
Visit(p->data);
p = p->rchild;
}
}
return OK;
}
3.非递归后序遍历
/*非递归后序遍历*/
Status PosOrderTraverse1(BiTree T, Status(*Visit)(TELemType e)){
BiTree p;
Stack S;
InitStack(S);
p = T;
while (p != NULL || !StackEmpty(S)){
while (p != NULL){
p->isFirst = true;
Push(S, p);
p = p->lchild;
}
if (!StackEmpty(S)){
Pop(S, p);
if (p->isFirst == true){ //该结点p是否是第一次出现在栈顶
p->isFirst = false;
Push(S, p);
p = p->rchild;
}
else{
Visit(p->data);
p = NULL;
}
}
}
return OK;
}