输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印

输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。   
例如输入
  8
  / \
 6 10
/ \ / \
5 7 9 11

输出8 6 10 5 7 9 11。


#include "stdlib.h"
#include "stdio.h"


typedef struct BTNode
{
	int data;
	struct BTNode *lnode;
	struct BTNode *rnode;
}BTNode;


BTNode *CreateTree(int pre[], int in[], int l1, int r1, int l2, int r2){
	
	BTNode *s;
	
	int i;
	if(l1 > r1)
		return NULL;

	s = (BTNode *)malloc(sizeof(BTNode));
	s->lnode = s->rnode = NULL;
	for(i=l2; i<=r2; ++i){
		if(pre[l1] == in[i]){
			break;
		}
	}
	s->data = in[i];

	s->lnode = CreateTree(pre, in, l1+1, l1+i-l2, l2, i-1);
	s->rnode = CreateTree(pre, in, l1+i-l2+1, r1, i+1, r2);

	return s;
}

void PrePrint(BTNode *p){
	
	if(p != NULL){
		printf("%d ", p->data);
		
		PrePrint(p->lnode);
		PrePrint(p->rnode);
	}
}


void InPrint(BTNode *p){
	
	if(p != NULL){
		InPrint(p->lnode);
		
		printf("%d ", p->data);
		
		InPrint(p->rnode);

	}
}

void LevelTraverse(BTNode *p){
	
	int maxSize = 50;

	BTNode *queue[50];
	int front, rear;
	
	front = rear = 0;

	if(p != NULL){
		
		//Get in queue
		rear = (rear+1)%maxSize;
		queue[rear] = p;
		
		//The queue is not empty
		while(front != rear){
			
			// Get out queue
			front = (front+1)%maxSize;
			p = queue[front];
			
			//Visit queue
			printf("%d ", p->data);
			
			if(p->lnode != NULL){
				//Get in queue
				rear = (rear+1)%maxSize;
				queue[rear] = p->lnode;
			}
			
			if(p->rnode != NULL){
				//Get in queue
				rear = (rear+1)%maxSize;
				queue[rear] = p->rnode;
			}

		}
		
	}
}



void main(){
	
	int pre[] = {10, 5, 4, 7, 12, 8, 11, 6};
	int in[] = {4, 5, 12, 7, 10, 11, 8, 6};

	BTNode *p;
	p = CreateTree(pre, in, 0, 7, 0, 7);
	

	LevelTraverse(p);
	
	putchar('\n');
	PrePrint(p);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值