03-树2 List Leaves (25分)

在这里插入图片描述
思路跟何老师讲的一样,无非就是把队列和二叉树的层序遍历组合起来。

#include<stdio.h>
#include<stdlib.h>
#define MAX 10
#define null -1
typedef struct QNode * Queue;
struct QNode{
	int front,rear;
	int *data;
	int Maxsize;
};
typedef struct TreeNode * Tree;
struct TreeNode{
	int left,right;
}T[MAX];

Queue Create(int Maxsize);
int BuildTree(struct TreeNode T[], int n);
void AddQ(Queue Q, int X);
int IsEmpty(Queue Q);
int Delete(Queue Q);

int main(void)
{
	int N,R,K,num=0;
	scanf("%d", &N);
	R=BuildTree(T, N);
	
	Queue Q = Create(N);
	
	AddQ(Q,R);
	
	while(IsEmpty(Q)==1){
		K = Delete(Q);
		if (T[K].left != -1 && T[K].right !=-1){
			AddQ(Q,T[K].left);
			AddQ(Q,T[K].right);
		}
		else if (T[K].left == -1 && T[K].right !=-1)
			AddQ(Q,T[K].right);
		else if (T[K].left != -1 && T[K].right ==-1)
			AddQ(Q,T[K].left);
		else{
			num++;
			if (num==1)
				printf("%d",K);
			else
				printf(" %d",K);
		}
	}
	
	return 0;
}

Queue Create(int Maxsize)
{
	Queue Q = (Queue)malloc(sizeof(struct QNode));
	Q->data=(int*)malloc(Maxsize*sizeof(int));
	Q->Maxsize=MAX;
	Q->front=Q->rear=0;
	return Q;
}

int BuildTree(struct TreeNode T[], int n)
{
	int Root=null,i,check[n];
	char cl,cr;
	if (n){
		for (i=0; i<n; i++)
			check[i] = 0;
		for (i=0; i<n; i++){
			getchar();
			scanf("%c %c", &cl, &cr);
			if (cl != '-'){
				T[i].left = cl-'0';
				check[T[i].left] = null;
			}
			else
				T[i].left = null;
			if (cr != '-'){
				T[i].right = cr-'0';
				check[T[i].right] = null;
			}
			else
				T[i].right = null;
		}
	}
	for (i=0; i<n; i++){
		if (check[i]==0){
			Root = i;
			break;
		}
	}
	return Root;
}

void AddQ(Queue Q, int X)
{
	if ((Q->rear+1)%(Q->Maxsize) == Q->front)
		return;
	else{
		Q->rear = (Q->rear+1)%(Q->Maxsize);
		Q->data[Q->rear] = X;
	}
}

int IsEmpty(Queue Q)
{
	if (Q->front == Q->rear)
		return 0;
	else
		return 1;
}
int Delete(Queue Q)
{
	if (IsEmpty(Q)==0)
		return -1;
	else{
		Q->front = (Q->front+1)%Q->Maxsize;
		return Q->data[Q->front];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值