#include"stdio.h"
#include"malloc.h"
#include"LinkStack.c"
typedef int ElemType;
typedef struct BitNode{
ElemType data;
struct BitNode *lchild,*rchild;
}BitTree;
//1、利用前序遍历递归创建二叉树
BitTree * CreateTree(){
BitTree *T;
ElemType e;
printf("请输入元素的值,-1代表到叶子结点:");
scanf("%d",&e);
if(e == -1){
return NULL;
}else{
T=(BitTree *)malloc(sizeof(BitTree));
if(!T){
printf("结点分配失败!\n");
}else{
T->data=e;
T->lchild=CreateTree();
T->rchild=CreateTree();
}
return T;
}
}
//1、递归前序遍历二叉树
void FVisit(BitTree *T){
if(T){
printf("%d\t",T->data);
FVisit(T->lchild);
FVisit(T->rchild);
}
}
//2、递归中序遍历二叉树
void MVisit(BitTree *T){
if(T){
MVisit(T->lchild);
printf("%d\t",T->data);
MVisit(T->rchild);
}
}
//3、递归后序遍历二叉树
void LVisit(BitTree *T){
if(T){
LVisit(T->lchild);
LVisit(T->rchild);
printf("%d\t",T->data);
}
}
//4、前序非递归遍历二叉树
void PreOrder(BitTree *T ,void (*visit)(BitTree *T)){
if(T==NULL){
return ;
}
//初始化辅助栈
LinkStack *s;
s=InitStack();
BitTree *p=T;
while(p != NULL){
visit(p);//访问根节点p
if(p->rchild != NULL){
Push(s,p->rchild);//右孩子进栈
}
if(p->lchild != NULL){
p=p->lchild;//指向左孩子
}
else{//回溯
if(IsEmpty(s)){
break;
}
p=GetTop(s);
Pop(s);
}
}
}
/*
//5、中序非递归遍历二叉树
void InOrder(BitTree *T ,void (*visit)(BitTree *T)){
if(T==NULL){
return ;
}
//初始化辅助栈
LinkStack *s;
s=InitStack();
BitTree *p=T;
do{
while(p != NULL){//一直到最左下
Push(s,p);
p=p->lchild;
}
//若进行到这里左子树为空
if(!IsEmpty(s)){//栈不为空时退栈,然后访问该元素
p=GetTop(s);
Pop(s);
visit(p);
p=p->rchild;
}
}while(p != NULL || !IsEmpty(s));//p==NuLL表示右子树为空,然后栈如果也为空的话,处理完毕
}
*/
/*
//6、后序非递归遍历二叉树
void PostOrder(BitTree *T ,void (*visit)(BitTree *T)){
if(T==NULL){
return ;
}
//初始化辅助栈
LinkStack *s;
s=InitStack();
BitTree *cur=T;//当前结点
BitTree *pre=NULL;//前一次访问的结点
while(cur != NULL || !IsEmpty(s)){
while(cur != NULL){
Push(s,cur);
cur=cur->lchild;
}
cur=GetTop(s);
//当前结点的右孩子如果为空或者已经被访问过,则访问当前结点
if(cur->rchild == NULL || cur->rchild==pre){
visit(cur);
pre=cur;
Pop(s);
cur=NULL;
}else{
cur=cur->rchild;//否则访问右孩子
}
}
}
*/
void print(BitTree *T){
printf("%d\t",T->data);
}
main(){
BitTree *T;
T=CreateTree();
printf("递归前序遍历序列为:");
FVisit(T);
printf("\n");
/*
printf("递归中序遍历序列为:");
MVisit(T);
printf("\n");
printf("递归后序遍历序列为:");
LVisit(T);
printf("\n");
*/
printf("非递归前序遍历序列为:");
PreOrder(T,print);
printf("\n");
/*
printf("非递归中序遍历序列为:");
InOrder(T,print);
printf("\n");
printf("非递归后序遍历序列为:");
PostOrder(T,print);*/
}
前、中、后、序递归遍历二叉树以及非递归遍历
最新推荐文章于 2024-06-03 17:15:00 发布