`
u010815305
  • 浏览: 28285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从上往下打印二叉树

 
阅读更多
题目描述:

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。

输出:

对应每个测试案例,
按照从上之下,从左至右打印出二叉树节点的值。

样例输入:
7
8 6 5 7 10 9 11
d 2 5
d 3 4
z
z
d 6 7
z
z
样例输出:
8 6 10 5 7 9 11
#include<stdio.h>
#include<stdlib.h>

struct BTNode
{
	int data;
	int rchild;
	int lchild;
};

struct Node
{
	struct BTNode data;
	struct Node* pNext;
};
struct Queue
{
	struct Node* front;//队列头指针 
	struct Node* rear; //队列尾指针 
};

//创建一个空队列 
Queue* createQueue()
{
	Queue* queue= (Queue*)malloc(sizeof(Queue));
	
	queue->front=(Node*)malloc(sizeof(Node));
	
	if(!queue||!queue->front)
	{
		printf("queue or front malloc faild");
		exit(-1);	
	}
	else
	{
		queue->rear=queue->front;//队列头指针和尾指针指向一起 
		queue->front-> pNext=NULL;
	}
	return queue;
}

bool isEmpty(Queue* queue)
{
	if(queue->front==queue->rear)
		return true;
	else
		return false;
}
//进队列操作   
void enQueue(Queue* queue,BTNode e)
{
	Node* pNew= (Node*)malloc(sizeof(Node*));
	if(!pNew)
	{
		printf("pNew malloc failed");
		exit(-1);
	}
	else
	{
		pNew->data=e;
		pNew->pNext=NULL;
		queue->rear->pNext=pNew;
		queue->rear=pNew;
	}
	
}
bool deQueue(Queue* queue,BTNode* pData)
{
	if(isEmpty(queue)){
		return false;
	}
	else
	{
		Node* p = queue->front->pNext;
		*pData=p->data;
		queue->front->pNext=p->pNext;
		
		
		
		if(queue->rear==p)
			queue->rear=queue->front;
		//free(p);
	}
	return true;
}
void destroyQueue(Queue* queue)
{
	if(isEmpty(queue))
		return;
	else
	{
		while(queue->front)
		{
			queue->rear=queue->front->pNext;
			free(queue->front);
			queue->front=queue->rear;
		}
	}
	
	//free(queue);
	queue=0;
	return;
}
void levelTraverse(BTNode* pTree,int index,int * levelTra,int n)
{
	if(pTree==NULL)
		return ;
	if(index==-1)
		return;
	BTNode pBTNode;
	Queue * queue=createQueue();
	enQueue(queue,pTree[0]);
	
	int i=0;
	while(!isEmpty(queue)&&i<n)
	{
		deQueue(queue,&pBTNode);
		
		levelTra[i++]=pBTNode.data;
		if(pBTNode.lchild!=-1)
			enQueue(queue,pTree[pBTNode.lchild]);
		if(pBTNode.rchild!=-1)
			enQueue(queue,pTree[pBTNode.rchild]);
	}
	
	destroyQueue(queue);
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		BTNode *pTree=NULL;
		if(n>0)
		{
			pTree=(BTNode*)malloc(n*sizeof(BTNode));
			
			if(pTree==NULL)
				exit(-1);
			int i,data;
			
			for(i=0;i<n;i++)
			{
				scanf("%d",&data);
				pTree[i].data=data;
				pTree[i].rchild=-1;
				pTree[i].lchild=-1;
			}
			
			for(i=0;i<n;i++)
			{
				char ch;
				
				while(getchar()!='\n')
					continue;
				scanf("%c",&ch);
				
				if(ch=='z')
					continue;
				else if(ch=='l')
				{
					int lindex;
					scanf("%d",&lindex);
					pTree[i].lchild=lindex-1;
				} 
				else if(ch=='r')
				{
					int rindex;
					scanf("%d",&rindex);
					pTree[i].rchild=rindex-1;
				}
				else if(ch=='d')
				{
					int lindex,rindex;
					scanf("%d",&lindex);
					scanf("%d",&rindex);
					pTree[i].lchild=lindex-1;
					pTree[i].rchild=rindex-1; 
				}
			} 
		}
		
		int levelTra[n];
		levelTraverse(pTree,0,levelTra,n);
		int i;
		for(i=0;i<n;i++)
		{
			if(i==n-1)
				printf("%d\n",levelTra[i]);
			else
				printf("%d",levelTra[i]);
		} 
		
		free(pTree);
		pTree=NULL;
		 
	}
	return 0;
}
结果:
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics