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

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值