二叉树的遍历
#include <stdbool.h>
#include <stdio.h>
#include <malloc.h>
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
int ltag,rtag;
}BitNode,*BitTree;
typedef struct Queue{
BitNode * data[20];
int size;
int front,rear;
}Que,*Queue;
void InitQueue(Queue*);
bool EnQueue(Queue,BitNode*);
bool OutQueue(Queue,BitNode**);
bool Empty(Queue );
void MyVisit(BitNode * node);
void creatNodeGen(BitTree *ptree,int data);
void PreOrder(BitTree tree);
bool TreeInsert(BitNode *father,int k,int data);
void InOrder(BitTree);
void PostOrder(BitTree);
void LevelOrder(BitTree);
void print_Queue(Queue);
void InThread(BitTree);
void InThreadVisit(BitNode *);
BitNode *pre=NULL;
void InitQueue(Queue * Q){
Queue p=(Queue)malloc(sizeof(Que));
p->size=0;
p->front=0;
p->rear=0;
*Q=p;
}
bool EnQueue(Queue Q,BitNode * pnode){
if(Q->size==20)return false;
if(pnode==NULL)return false;
Q->data[Q->front]=pnode;
Q->front=(Q->front+1)%20;
Q->size++;
return true;
}
bool OutQueue(Queue Q,BitNode **pnode){
if(Empty(Q))return false;
*pnode=Q->data[Q->rear];
Q->rear=(Q->rear+1)%20;
Q->size--;
return true;
}
bool Empty(Queue Q){
if(Q->size==0)return true;
return false;
}
void creatNodeGen(BitTree* ptree,int data){
BitNode * q = (BitNode *) malloc (sizeof(BitNode));
q->lchild=q->rchild=NULL;
q->ltag=q->rtag=0;
q->data=data;
*ptree=q;
}
bool TreeInsert(BitNode *father,int k,int data){
if(father==NULL||(father->lchild!=NULL&&k==1)||(father->rchild!=NULL&&k==2))return false;
BitNode * q = (BitNode *)malloc(sizeof(BitNode));
q->rchild=q->lchild=NULL;
q->ltag=q->rtag=0;
q->data=data;
if(k==1)father->lchild=q;
else father->rchild=q;
return true;
}
void PreOrder(BitTree tree){
if(tree==NULL)return;
MyVisit(tree);
PreOrder(tree->lchild);
PreOrder(tree->rchild);
}
void InOrder(BitTree tree){
if(tree!=NULL){
InOrder(tree->lchild);
MyVisit(tree);
InOrder(tree->rchild);
}
}
void PostOrder(BitTree tree){
if(tree!=NULL){
PostOrder(tree->lchild);
PostOrder(tree->rchild);
MyVisit(tree);
}
}
void LevelOrder(BitTree tree){
Queue Q;
BitNode *q;
InitQueue(&Q);
EnQueue(Q,tree);
while(OutQueue(Q,&q)){
EnQueue(Q,q->lchild);
EnQueue(Q,q->rchild);
MyVisit(q);
}
}
void MyVisit(BitNode * node){
printf("%d\n",node->data);
}
void InThread(BitTree tree){
if(tree!=NULL){
InThread(tree->lchild);
InThreadVisit(tree);
InThread(tree->rchild);
}
}
void InThreadVisit(BitNode * node){
if(node->lchild==NULL){
node->lchild=pre;
node->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=node;
pre->rtag=1;
}
pre=node;
}
int main(){
BitTree tree=NULL;
creatNodeGen(&tree,3);
TreeInsert(tree,1,5);
TreeInsert(tree,2,6);
TreeInsert(tree->lchild,1,2);
TreeInsert(tree->lchild,2,4);
TreeInsert(tree->lchild->lchild,1,1);
TreeInsert(tree->rchild,2,7);
TreeInsert(tree->rchild->rchild,1,8);
PreOrder(tree);
printf("以上是先序遍历\n");
InOrder(tree);
printf("以上是中序遍历\n");
PostOrder(tree);
printf("以上是后序遍历\n");
LevelOrder(tree);
printf("以上是层次遍历\n");
return 0;
}