二叉树层次遍历(单层输出)

每一层都是从左到右,但是每一层输出结束要换行(使用队列)
#include "stdio.h"
#include "stdlib.h"

#define MaxSize 50
/*************定义数据结构************/
typedef struct TreeNode {
	int data;
	struct TreeNode *lchild;
	struct TreeNode *rchild;
}BinTreeNode,*BinTree;

typedef struct QNode {
	BinTree data;
	int front;
	int rear;
}QueueNode,*Queue;

/*************************定义队列部分************************/
Queue CreatQueue(void) {
	Queue Q = (Queue)malloc(MaxSize*sizeof(QueueNode)); 
	Q -> data = (BinTree)malloc(MaxSize*sizeof(BinTreeNode));
	Q -> front = 0;
	Q -> rear = 0;
	return Q;
}

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

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

/*************************定义树部分************************/
BinTree CreatTree(BinTree Tree) {
	int temp = 0;
	scanf("%d",&temp);
	if(temp == 0) 
		Tree = NULL;
	else {
		Tree = (BinTree)malloc(sizeof(BinTreeNode));
		Tree -> data = temp;
		Tree -> lchild = CreatTree(Tree -> lchild);
		Tree -> rchild = CreatTree(Tree -> rchild);
		//Tree -> Count = 0;
	}
	return Tree;
}

/**************************树的遍历***************************/
void Preorder_traversal(BinTree Tree) {  //先序递归实现
	if(Tree) {
		printf("%d ",Tree -> data);
		Preorder_traversal(Tree -> lchild);
		Preorder_traversal(Tree -> rchild);
	}
}

void Levelorder_traversal(BinTree Tree) {  //层次遍历
	Queue Q = NULL; 
	int temp = Tree -> data, ntemp = Tree -> data;
 	Q = CreatQueue();
 	if(Tree) {
 		AddQ(Q,*Tree);
 		while(!(Q -> front == Q -> rear)) {
 			Tree = DeleteQ(Q);
 			if(Tree -> lchild) { AddQ(Q,*Tree -> lchild);  ntemp = Tree -> lchild -> data;}
 			if(Tree -> rchild) { AddQ(Q,*Tree -> rchild);  ntemp = Tree -> rchild -> data;}
 			if(Tree -> data == temp) {
 				temp = ntemp;
 				printf("%d\n",Tree -> data);
 			}
 			else
 				printf("%d ",Tree -> data);
 		}	
 	}
}

/**************************主函数***************************/
int main()
{
    BinTree Tree = NULL;
    Tree = CreatTree(Tree);//ABC##DE#G##F###  1 2 3 0 0 4 5 0 6 0 0 7 0 0 0
    printf("递归先序遍历结果:\n"); //1 2 4 7 0 0 8 0 0 0 3 5 9 0 0 0 6 0 10 0 0 
    Preorder_traversal(Tree);
    printf("\n层次遍历结果:\n");
    Levelorder_traversal(Tree);
    return 0;
}

在上面基础上要求相邻层反向输出(使用二个栈)

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

/*************定义数据结构************/
typedef struct TreeNode {
	int data;
	struct TreeNode *lchild;
	struct TreeNode *rchild;
}BinTreeNode,*BinTree;

typedef struct StackNode {
	BinTree data;
	int Top;
	int MaxSize;
}StackNode,*Stack;

/*************************定义堆栈部分************************/
Stack CreatStack(int MaxSize) {
	Stack S = (Stack)malloc(MaxSize*sizeof(StackNode));
	S -> data = (BinTree)malloc(MaxSize*sizeof(BinTreeNode));
	S -> Top = -1;
	S -> MaxSize = MaxSize;
	return S;
}

void Push(Stack Temp,BinTreeNode B) {
	if(Temp -> Top == Temp -> MaxSize - 1) {
		printf("堆栈满");
		return;	
	}
	else {
		Temp -> data[++(Temp -> Top)] = B;
		return;
	}
}

BinTree Pop(Stack Temp) {
	if(Temp -> Top ==  -1) {
		printf("堆栈空");
		return NULL;	
	}
	else {
		return	&(Temp -> data[(Temp -> Top)--]);	
	}
}

/*************************定义树部分************************/
BinTree CreatTree(BinTree Tree) {
	int temp = 0;
	scanf("%d",&temp);
	if(temp == 0) 
		Tree = NULL;
	else {
		Tree = (BinTree)malloc(sizeof(BinTreeNode));
		Tree -> data = temp;
		Tree -> lchild = CreatTree(Tree -> lchild);
		Tree -> rchild = CreatTree(Tree -> rchild);
		//Tree -> Count = 0;
	}
	return Tree;
}

/**************************树的遍历***************************/
void Preorder_traversal(BinTree Tree) {  //先序递归实现
	if(Tree) {
		printf("%d ",Tree -> data);
		Preorder_traversal(Tree -> lchild);
		Preorder_traversal(Tree -> rchild);
	}
}

void Levelorder_traversal(BinTree Tree) {  //层次遍历
	Stack S1 = CreatStack(50);  
	Stack S2 = CreatStack(50);
	Stack S3 = CreatStack(50);  
	int flag = 0;
	BinTree T = NULL;
	Push(S1,*Tree);
 	while(!(S1 -> Top ==  -1)) {
 			T = Pop(S1);
 			printf("%d ",T -> data);
  			if(flag == 0) {
 				if(T -> lchild) Push(S2,*(T -> lchild));
 				if(T -> rchild) Push(S2,*(T -> rchild));
 			}
  			else if(flag == 1) {
 				if(T -> rchild) Push(S2,*(T -> rchild));
 				if(T -> lchild) Push(S2,*(T -> lchild));
  			} 			
  			if(S1 -> Top ==  -1) {
				flag = 1 - flag;
				S3 = S1; 
				S1 = S2;
				S2 = S3;
				printf("\n");
 			}
 		}	
} 

/**************************主函数***************************/
int main()
{
    BinTree Tree = NULL;
    Tree = CreatTree(Tree);//ABC##DE#G##F###  1 2 3 0 0 4 5 0 6 0 0 7 0 0 0
    printf("递归先序遍历结果:\n"); //1 2 4 7 0 0 8 0 0 0 3 5 9 0 0 0 6 0 10 0 0 
    Preorder_traversal(Tree);
    printf("\n层次遍历结果:\n");
    Levelorder_traversal(Tree);
    return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值