层次遍历算法:
void _PrintTree_f5(BiTree a)
{
LinkQueue b;
b=InItQueue();
EnQueue(&b,a);
while(!QueueEmpty(b))
{
BiTree d;
d=getFront(b);
printf("%c\n",d->data);
if(d->lchild)
{
EnQueue(&b,d->lchild);
}
if(d->rchild)
{
EnQueue(&b,d->rchild);
}
BiTree c;
DeQueue(&b,&c);
}
free(b);
}
通过层次遍历统计度为1的二叉树的算法:
void _PrintTree_f5(BiTree a)
{
LinkQueue b;
b=InItQueue();
EnQueue(&b,a);
while(!QueueEmpty(b))
{
BiTree d;
d=getFront(b);
printf("%c\n",d->data);
if(d->lchild)
{
EnQueue(&b,d->lchild);
}
if(d->rchild)
{
EnQueue(&b,d->rchild);
}
BiTree c;
DeQueue(&b,&c);
}
free(b);
}
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *rchild,*lchild;
}*BiTree;
typedef struct
{
BiTree data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}*LinkQueue;
LinkQueue InItQueue()
{
LinkQueue a;
a=(LinkQueue)malloc(sizeof(LinkQueue));
a->front=a->rear=(QNode*)malloc(sizeof(QNode));
a->front->next=NULL;
return a;
}
void EnQueue(LinkQueue *a,BiTree d)
{
QueuePtr b;
b=(QNode*)malloc(sizeof(QNode));
b->data=d;
b->next=NULL;
(*a)->rear->next=(struct QNode*)b;
(*a)->rear=b;
}
void DeQueue(LinkQueue *a,BiTree *c)
{
if((*a)->front==(*a)->rear)
{
printf("队列空!\n");
return;
}
QueuePtr b;
b=(QNode*)(*a)->front->next;
*c=b->data;
(*a)->front->next=b->next;
if(b==(*a)->rear)
{
(*a)->rear=(*a)->front;
}
free(b);
}
int QueueEmpty(LinkQueue a)
{
if(a->rear==a->front)
{
return 2;
}
else
{
return 0;
}
}
void CreateBiTree(BiTree *a)
{
char data;
scanf("%c",&data);
fflush(stdin);
if(data=='#')
{
*a=NULL;
}
else
{
*a=(struct BiTNode*)malloc(sizeof(struct BiTNode));
(*a)->data=data;
printf("请输入左孩子:\n");
CreateBiTree(&(*a)->lchild);
printf("请输入右孩子:\n");
CreateBiTree(&(*a)->rchild);
}
}
void _PrintTree_f1(BiTree a)
{
if(a)
{
printf("%c\n",a->data);
_PrintTree_f1(a->lchild);
printf("%c\n",a->data);
_PrintTree_f1(a->rchild);
}
}
void _PrintTree_f2(BiTree a)
{
if(a)
{
printf("%c\n",a->data);
_PrintTree_f2(a->lchild);
_PrintTree_f2(a->rchild);
}
}
void _PrintTree_f3(BiTree a)
{
if(a)
{
_PrintTree_f3(a->lchild);
_PrintTree_f3(a->rchild);
printf("%c\n",a->data);
}
}
void Delete_Tree(BiTree *a)
{
if(*a)
{
Delete_Tree(&(*a)->lchild);
Delete_Tree(&(*a)->rchild);
BiTree b;
b=*a;
free(b);
}
}
void _PrintTree_f4(BiTree a)
{
if(a)
{
_PrintTree_f4(a->lchild);
printf("%c\n",a->data);
_PrintTree_f4(a->rchild);
}
}
BiTree getFront(LinkQueue a)
{
QueuePtr b;
b=(QueuePtr)a->front->next;
return b->data;
}
void _PrintTree_f5(BiTree a)
{
LinkQueue b;
b=InItQueue();
EnQueue(&b,a);
while(!QueueEmpty(b))
{
BiTree d;
d=getFront(b);
printf("%c\n",d->data);
if(d->lchild)
{
EnQueue(&b,d->lchild);
}
if(d->rchild)
{
EnQueue(&b,d->rchild);
}
BiTree c;
DeQueue(&b,&c);
}
free(b);
}
int length(BiTree a)
{
int c=0;
LinkQueue b;
b=InItQueue();
EnQueue(&b,a);
while(!QueueEmpty(b))
{
BiTree d;
d=getFront(b);
if(((d->lchild)||(d->rchild))&&(!((d->lchild)&&(d->rchild))))
{
c++;
}
if(d->lchild)
{
EnQueue(&b,d->lchild);
}
if(d->rchild)
{
EnQueue(&b,d->rchild);
}
BiTree c;
DeQueue(&b,&c);
}
free(b);
return c;
}
main()
{
BiTree a;
printf("请输入根节点:\n");
CreateBiTree(&a);
printf("层次遍历:\n");
_PrintTree_f5(a);
printf("双序遍历:\n");
_PrintTree_f1(a);
printf("中序遍历:\n");
_PrintTree_f4(a);
printf("前序遍历:\n");
_PrintTree_f2(a);
printf("后序遍历:\n");
_PrintTree_f3(a);
int b;
b=length(a);
printf("度为1的子树数量:%d\n",b);
Delete_Tree(&a);
system("pause");
return 0;
}
程序运行结果: