浙大数据结构课程习题 03-树2 List Leaves (25分) 的C语言实现

代码实现

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

#define MaxSize 10
#define MaxTree 10
#define ElementType int
#define Tree int
#define Null -1

struct TreeNode
{
	ElementType data;
	Tree Left;
	Tree Right;
} T1[MaxTree], T2[MaxTree];

struct QNode {
	ElementType data[MaxSize];
	int rear;
	int front;
};
typedef struct QNode* Queue;

Tree BuildTree( struct TreeNode T[] );
void LevelOrderTraversal( Tree R );
Queue CreateQ();
void AddQ( Queue PtrQ, ElementType item);
ElementType DeleteQ( Queue PtrQ );
int isEmpty(Queue Q);

int main()
{
	LevelOrderTraversal(BuildTree(T1));
	return 0;
}

Tree BuildTree( struct TreeNode T[] )
{
	int i, N;
	int* check;
	char l, r;
	Tree Root;
	
	Root = Null;
	
	scanf("%d", &N);
	
	check = (int*)malloc(sizeof(int)*N);
	for ( i=0; i<N; i++ ) check[i] = 0;
	if ( N ) {
		for ( i=0; i<N; i++ ) {
			T[i].data = i;
			scanf("\n%c %c", &l, &r);
			if ( l != '-' ) {
				T[i].Left = l-'0';
				check[T[i].Left] = 1;
			} else {
				T[i].Left = Null;
			}
			if ( r != '-' ) {
				T[i].Right = r-'0';
				check[T[i].Right] = 1;
			} else {
				T[i].Right = Null;
			}
		}
		for ( i=0; i<N; i++ ) {
			if ( !check[i] ) break;
		}
		Root = i;
	}
	return Root;
} 

void LevelOrderTraversal( Tree R ) //层序遍历 
{
	int flag=0;
	Tree T;
	Queue Q;
	if ( !T1 ) return;
	Q = CreateQ();
	AddQ( Q, R );
	while ( !isEmpty(Q) ) {
		T = DeleteQ( Q );
		if ( T1[T].Left == Null && T1[T].Right == Null ) 
		{
			if ( flag ) printf(" ");
			printf("%d", T1[T].data);
			flag++;
		}
		//printf("%d ", T1[T].data); 
		if ( T1[T].Left != Null ) AddQ( Q, T1[T].Left);
		if ( T1[T].Right != Null ) AddQ( Q, T1[T].Right);
	}
}

Queue CreateQ()
{
	int i;
	Queue Q;
	Q = (Queue)malloc(sizeof(struct QNode));
	for ( i=0; i<MaxSize; i++ ) {
		Q->data[i] = Null;
	}
	Q->front = 0;
	Q->rear = 0;
	return Q;
}

void AddQ( Queue PtrQ, ElementType item)
{
	if ( (PtrQ->rear+1)%MaxSize	== PtrQ->front ) {
		printf("队列满");
		return; 
	}
	PtrQ->rear= (PtrQ->rear+1)%MaxSize;
	PtrQ->data[PtrQ->rear] = item;
}

ElementType DeleteQ( Queue PtrQ )
{
	if ( PtrQ->front == PtrQ->rear ) {
		printf("队列空");
		return Null;
	} else {
		PtrQ->front = (PtrQ->front+1)%MaxSize;
		return PtrQ->data[PtrQ->front];
	}
} 

int isEmpty(Queue Q)
{
	if ( Q->rear == Q->front ) return 1;
	else return 0;
}


思路

首先明确要用树的层次遍历的方法进行遍历(因为这个算是比较简单的方法了,最开始想用堆栈存每个叶子节点的深度与数值,结果算深度好悬没算死…)具体队列的操作可以看浙大课程2.3,至于基本的create和判空自己随便写写就好。BuildTree操作在小白专场里也讲的很明确,所以这个就算是对老师讲课内容的整理综合小应用程序吧(然而还是做了将近俩小时…)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值