二叉树的递归遍历以及层次遍历

来源:互联网 发布:stm8s003k3t6数据手册 编辑:程序博客网 时间:2024/06/05 08:54

#include <stdio.h>
#include <stdlib.h>

#define ERROR 0
#define OK 1

typedef char TElemType;
typedef int Status;


//二叉树的二叉链表存储表示
typedef struct BiTNode
 {
  TElemType data;
  struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//定义链式队列结点
typedef struct QNode
{
 BiTree Queuedata;
 struct QNode * next;
}QNode,* QueuePtr;
//定义链式队列
typedef struct
{
 QueuePtr front;
 QueuePtr rear;
}LinkQueue;

//按照先序次序构造二叉树
Status CreatBiTree(BiTree &T)
{char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
 if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
  return ERROR;
 T->data=ch;
 CreatBiTree(T->lchild);
 CreatBiTree(T->rchild);
}
return OK;
}
//递归先序遍历二叉树
Status PreOrder ( BiTree T )
{
 if ( T!=NULL)
 {
  printf("%c",T->data); 
  PreOrder ( T->lchild );
  PreOrder ( T->rchild );
 }
 return OK;
}

//递归中序遍历二叉树
Status InOrder ( BiTree T )
{
 if ( T!=NULL)
 {
  InOrder ( T->lchild );
  printf("%c",T->data);
  InOrder ( T->rchild );
 }
 return OK;
}

//递归后序遍历二叉树
Status LastOrder ( BiTree T )
{
 if (T!=NULL)
 {
  LastOrder( T->lchild );
  LastOrder( T->rchild );
  printf("%c",T->data);
 }
 return OK;
}

//初始化一个带头结点的队列
Status InitQueue(LinkQueue &Q)
{
 Q.front=(QNode*)malloc(sizeof(QNode));
 if (!Q.front)
  return ERROR;
 Q.rear=Q.front;
  Q.front->next=NULL;
 return OK;
}

//入队列
Status EnQueue(LinkQueue &Q,BiTree e)
{
 QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
 if (!s)
return ERROR;
 s->Queuedata=e;
 s->next=NULL;
 Q.rear->next=s;
 Q.rear=s;
 return OK;

}
//出队
int DelQueue(LinkQueue &Q, BiTree &e)
{
 char data1;
 QueuePtr s;
 s=Q.front->next;
 e=s->Queuedata;
    data1=e->data;
 Q.front->next=s->next;
 if(Q.rear==s)
  Q.rear=Q.front;
 free(s);
 
 return OK;
}
//队列的判断空操作
Status QueueEmpty(LinkQueue Q)
{
 
 if (Q.front->next==NULL)
    return OK;
 else return ERROR;
 
}
//按层次遍历
Status LevelBiTree(BiTree T)
{
 LinkQueue Q;
 
 InitQueue(Q);
 BiTree p = T;        
 if (T == NULL) return ERROR;
 
 EnQueue(Q,p);
 
 while (!QueueEmpty(Q))     
 {   DelQueue(Q, p);
  printf("%C",p->data);
 
 if (p->lchild) 
  EnQueue(Q, p->lchild);
 if (p->rchild)  
  EnQueue(Q, p->rchild);
 }

return OK;
}

int main()
{BiTree T;
printf("按照先序次序输入二叉树中结点的值.\n");
CreatBiTree(T);
printf("先序遍历二叉树:");
PreOrder(T);printf("\n");
printf("中序遍历二叉树:");
InOrder(T);printf("\n");
printf("后序遍历二叉树:");
LastOrder(T);printf("\n");
printf("按层次遍历二叉树:");
LevelBiTree(T);printf("\n");
return 0;
}

原创粉丝点击