C语言二叉树层次遍历和通过层次遍历找出度为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);
}

通过层次遍历统计度为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;
}

程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值