二叉树层序遍历

二叉树层序遍历

要求 先列出根,然后列出深度为一的那些节点,在列出深度为2的节点等等;

刚开始写这个程序,网上看了几篇,用了好多指针,初学乍道,没盯紧指针,有点眼花缭乱,所以按照自己思路写出来,验证可以:

#include"stdio.h"
#include"stdlib.h"
#define EOF  (-1)
#define ElementType int       
#define FatalError(str) fprintf(stderr,"%s\n",str),exit(1)
#define MaxSize 100
#define Error 0
#define Ok 1
typedef struct TreeNode *PtrToNode;
typedef PtrToNode Tree;
struct TreeNode
{
ElementType Element;
Tree Left;
Tree Right;
};
struct QueueRecord;
typedef struct QueueRecord *Queue;
void Enqueue(Tree T,Queue Q);
struct QueueRecord
{
int Capacity;//队列的最大容量
int Front;
int Rear;
int Size;
Tree Tm[MaxSize];
};
/*
   function:CreateQueue()
   功能:初始化队列
*/
Queue CreateQueue()
{
  Queue Q;
  Q=(Queue)malloc(sizeof(struct QueueRecord));
  Q->Capacity=MaxSize;
  Q->Front=0;
  Q->Rear=0;
  Q->Size=0;
  Q->Tm[Q->Front]=NULL;
  return Q;
}
/*
  函数: Succ(Value,Q)
  描述:Value:队列的队尾指标,Q 表示当前队列
  功能:判断队列是否溢出,并使队尾自加1,返回;
*/
int Succ(int Value,Queue Q)
{
if(++Value==Q->Capacity)
Value=0;
return Value;
}
/*
 函数:Enqueue(Bt,Q)
 描述:Bt为当前要入队列的节点,Q为当前队列
 功能:使指针所在的节点进入队列
*/
void Enqueue(Tree Bt,Queue Q)
{
    ++Q->Size;
 Q->Rear=Succ(Q->Rear,Q);
 Q->Tm[Q->Rear]=Bt;
}
/*
 函数:Insert(X,T)
 描述:X,二叉树中带插入值,T为根节点
 功能:将X按照查找二叉树形式插入树中
*/
Tree Insert(ElementType X,Tree T)
{
   if(T==NULL)
   {
  T=(Tree)malloc(sizeof(struct TreeNode));
  if(T==NULL)
  FatalError("out of place");
  else
  {
  T->Element=X;
  T->Left=T->Right=NULL;
  }
   }
   else
   {
  if(X<T->Element)
  T->Left=Insert(X,T->Left);
  else
  if(X>T->Element)
  T->Right=Insert(X,T->Right);
   }
  return T;
}
/*
  函数:CreateTree(T1)
  描述 T1为定义的二叉树
  功能:将键盘中敲入的数创建为二叉树
*/
Tree CreateTree(Tree T1)
{
int a;
T1=NULL;
   while(scanf("%d",&a))
   {    if(a==0)       //a为零时表示结束;
            break;
         else
 T1=Insert(a,T1);
  }
   return T1;
}
/*
  函数:LevelOrder(T1)
  描述:T1为已经建好的二叉树
  功能:将二叉树以层序的方式遍历,使用Enqueue函数
*/
void LevelOrder(Tree T1)
{  
Queue Q;
Q=CreateQueue();
Tree P;
      P=T1;
 if(P) Enqueue(P,Q);
 ++Q->Front;
   while((Q->Front)<=(Q->Size))
   { 
           P=Q->Tm[Q->Front];
        printf("%d\n",P->Element);
   if(P->Left) Enqueue(P->Left,Q);
   if(P->Right) Enqueue(P->Right,Q);
++Q->Front;
  
   }

}
int main()

Tree HeadT;
HeadT=CreateTree(HeadT);
LevelOrder(HeadT);
return 0;




}

一个相对简单的程序


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值