二叉树的先序遍历 ——(创建、插入、遍历(迭代、循环))系列操作

【问题描述】

写出二叉树先序遍历的递归与非递归算法。

【实验要求】

用户以先序遍历的方式键入二叉树各结点的数据域值(字符型),程序建立二叉树,然后分别用递归和非递归算法对二叉树进行遍历。每访问一个结点即打印该结点的数据域值。

例如,要建立如下二叉树,用户需依次键入’A’, ’B’, ’D’, ’ ’, ’ ’, ’ ’, ’C’, ’ ’, ’ ’这几个字符。(请参考下文的生成二叉树的算法。)

README

Author:YXP
e-mail:yxp189@protonmail.com
如有问题,请我联系~
转载请标明出处~

源代码	main.c
输入文件	Test.txt ("A","B","D"," ","C"," "," ")
输出结果	result.txt

注意:

1. 同目录下,设置Test.txt文件,作为输入。

内容为:(具体按照题目要求调整)

输入文件-----Test.txt

ABD C  

2.  本次代码中非递归遍历使用的方法-----针对题目给出的特定输入设计循环遍历。

    (以后将更新,使用栈的方法解决。)

    (有关栈的参考:双向栈的实现(数组)

实现代码:

基于层级数结构的框架实现,层级树结构的参考代码:实现任意层数、层长度 树结构(层次结构)----参考代码

                                                             相似应用例子:基数排序 (树结构/层级结构)

                                                                                      洗牌程序 (洗牌/箱子排序)

mian.c文件


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/*	
author:YXP
e-mail:yxp189@protonmail.com
如有问题,欢迎和我联系~
转载请标明出处~
*/
 
int NOW_LEVEL = 0;	//当前层级
int LEVEL = 2;		//搭建结构的层数;从0开始 
int TIME = 0;		//生成程序的迭代次数 
int PRINT_TIME = 0;	//打印的调用次数 
int counter = 0;	//层数计数器 
int NODE = 0;		//最底层分类数
 
struct _level {			//层级结构定义
	int level_th;				//第几层 
	int lenth;					//当前层的宽度 
	struct _level* last_level;	//上一层的地址 
	struct _level** next_level;	//下一层的链接 
	struct _node* head;			//储存节点头 
	struct _node* tail;			//储存末尾节点 
};
 
struct _node {			//数据节点定义 
	int CH_store;			//存储的字符
	int order;				//当前在节点在序列中的第几位
	int *traits;			//当前节点在层级中的位置
	struct _node* next;		//下一个节点
};
 
int Build_tree(struct _level** TOP, int *level_th, int level_num);	//生成层次结构 
void Initalize_level(struct _level** HEAD, int *level_th, int now_level_th);	//初始化层 
int Insert(struct _level** TOP,struct _node* Node,int* level_th);	//插入 
void Print_content(FILE *fp_w,struct _level** TOP,int *position_arr);			//打印指定位置元素 
void Print_All(FILE **fp_w,struct _level** TOP,int* level_th, int now_level_th);//打印出最底层元素的分布情况
void Print_All_Stack (FILE **fp_w,struct _level** TOP,int* level_th, int now_level_th);
int Find_ch_place(int CH,int** positin,int *level_th);			//找到字符(10x10)的插入位置 
int Create_struct_node(struct _node** Node,int CH,int *level_th,int order);//创建数据节点 
 
 
int main(int argc, char *argv[]) {
	clock_t start, finish;
	int level_th[3] = {1,2,2};	/*第一层一个点,第二层2个,第三层2个*/ //指定每一层的长度 
	struct _level* TOP = NULL;
	Build_tree(&TOP, level_th, LEVEL);//建立层级结构 
	
	
	printf ("@BUILDING...\n"); 
	
	int card;
	
	struct _node* Node;
	char* r_filename = "Test.txt";				//二读取文件中的内容“Test.txt”
	FILE* fp_r =fopen(r_filename, "r");	
	char* w_filename = "result.txt";			//二叉树的结果,输出到文件“result.txt”
	FILE* fp_w =fopen(w_filename, "w");	
	
	int i,num = 7;//总共的节点数目7 个 
	for (i=0;i<num;i++){
		fscanf(fp_r,"%c",&card);
		Create_struct_node(&Node,card,level_th,i);	//创建数据节点 
		Insert(&TOP,Node,Node->traits);	//在层级结构中插入数据节点
	}	
	printf ("@BUILDING END!\n");
	
	fprintf(fp_w," >>递归遍历\n");	
	Print_All(&fp_w,&TOP,level_th,NOW_LEVEL);//递归遍历 
	printf ("@Result_file has been sent to you folder! Pleae check it!\n");	
	
	fprintf(fp_w," >>非递归遍历\n");	
	Print_All_Stack (&fp_w,&TOP,level_th,1);// 非递归遍历 

	system("pause"); 
	return 0;
}
 
 
 
int Find_ch_place(int CH,int** positin,int *level_th)//对字符,找到应插入的位置
{
	int temp = CH;
	*positin = (int*)malloc((LEVEL+1)*sizeof(int));
	int i,gap = 10;
	//for (i=0;i<(LEVEL+1);i++){
		switch (CH){
			case 0:
				(*positin)[0] = 0;(*positin)[1] = -1;(*positin)[2] = -1;
				break;
			case 1:
				(*positin)[0] = 0;(*positin)[1] = 0;(*positin)[2] = -1;
				break;
			case 2:
				(*positin)[0] = 0;(*positin)[1] = 0;(*positin)[2] = 0;
				break;
			case 3:
				(*positin)[0] = 0;(*positin)[1] = 0;(*positin)[2] = 1;
				break;
			case 4:
				(*positin)[0] = 0;(*positin)[1] = 1;(*positin)[2] = -1;
				break;
			case 5:
				(*positin)[0] = 0;(*positin)[1] = 1;(*positin)[2] = 0;
				break;
			case 6:
				(*positin)[0] = 0;(*positin)[1] = 1;(*positin)[2] = 1;
				break;
			default :
				printf ("Find_ch_place overlod! Please Check!@\n");
				system("pause");
				break;	
		}
	//}
	return 0;
}
 
 
int Create_struct_node(struct _node** Node,int CH,int *level_th,int order)//创建数据节点
{
	*Node = (struct _node*)malloc(sizeof(struct _node));
	(*Node)->CH_store = CH;
	(*Node)->order = 0;
	(*Node)->next = NULL;
	Find_ch_place(order,&((*Node)->traits),level_th);
}
 
 
void Print_content(FILE *fp_w,struct _level** TOP,int *position_arr)//打印层级结构指定位置的元素
{
	struct _level** temp1 = NULL,**temp2 = TOP;
	int i,position;
	for(i=0;i<LEVEL;i++){
		temp1 = temp2;
		position = position_arr[i];
		if (fp_w != NULL){
			fprintf (fp_w,"%d-\n",position);
		}
		temp2 = (*temp1)[position].next_level;
	}
	position = position_arr[i];
	fprintf (fp_w,"%d-",position);
	
	struct _node* CH_store = (*temp2)[position].tail;
	if (CH_store != NULL){
		if (fp_w==NULL){
			printf ("Node = %c\n",CH_store->CH_store);
		}else{
			fprintf (fp_w,"Node = %c\t NUM = %d\n",CH_store->CH_store,CH_store->order+1);
		}
	}else{
		if (fp_w==NULL){
			printf ("%s\n","NULL");
		}else{
			fprintf (fp_w,"%s\n","NULL");
		}
	}
	
	
}
 
 
void Print_All(FILE **fp_w,struct _level** TOP,int* level_th, int now_level_th)//打印出总体的排序情况,并且输入到文件里。
{
	PRINT_TIME ++;
	int i = 0;
	for (i=0;i<level_th[now_level_th];i++)
	{
		int k;
		if(i == 0){
			fprintf (*fp_w,"\n");
		}
		for (k=0;k<now_level_th;k++){
			fprintf (*fp_w,"\t");
		}
		fprintf (*fp_w,"Lev= %d - Pos= %d -",now_level_th,i);
		if (now_level_th<LEVEL) {
				NOW_LEVEL++;
					if ((*TOP)[i].tail != NULL){
						fprintf (*fp_w,"Node= %c\tNUM= %d\n",((*TOP)[i].tail)->CH_store, ((*TOP)[i].tail)->order+1);
					}else{
						fprintf (*fp_w,"NULL\n");
					}
					Print_All(fp_w,&((*TOP)[i].next_level[0]), level_th, now_level_th+1);
				NOW_LEVEL--;
		}
		else {
			if(now_level_th == LEVEL){
				NODE ++;
				if ((*TOP)[i].tail != NULL){
					fprintf (*fp_w,"Node= %c\tNUM= %d\n",((*TOP)[i].tail)->CH_store, ((*TOP)[i].tail)->order+1);
				}else{
					fprintf (*fp_w,"NULL\n");
				}
			} 
		}
	}	
	return; 
}

 
 
void Print_All_Stack (FILE **fp_w,struct _level** TOP,int* level_th, int now_level_th)
{
	int now_level = 0,position = 0;
	int i,j,k;
	struct _level** temp1 = NULL,**temp2 = NULL;
	for (i=0;i<level_th[0];i++){
		if ((*TOP)[i].tail != NULL){
			fprintf (*fp_w,"%c",((*TOP)[i].tail)->CH_store);
		}else{
			fprintf (*fp_w,"Null ");
		}
		temp1 = (*TOP)[i].next_level;
		for (j=0;j<level_th[1];j++){
			if ((*temp1)[j].tail != NULL){
				fprintf (*fp_w,"\"%c\",",((*temp1)[j].tail)->CH_store);
			}else{
			fprintf (*fp_w,"Null ");
			}
			temp2 = (*temp1)[j].next_level;
			for (k=0;k<level_th[2];k++){
				if (((*temp2)[k].tail) != NULL){
					fprintf (*fp_w,"\"%c\",",((*temp2)[k].tail)->CH_store);
				}else{
					fprintf (*fp_w,"Null ");
				}
			}
		}
	}
}
 
int Insert(struct _level** TOP,struct _node* Node,int* level_th)//在层级结构中的指定位置插入元素
{
	int now_level = 0,position = 0;
	struct _level** temp1 = NULL,**temp2 = TOP;
	for (now_level=0;now_level<LEVEL;now_level++){
		temp1 = temp2;
		if (Node->traits[now_level+1] == -1){
			goto NOW_INSERT;
		}
		position = Node->traits[now_level];
		temp2 = (*temp1)[position].next_level;
	}
	NOW_INSERT:;
	position = Node->traits[now_level];
	if ((*temp2)[position].tail == NULL){
		Node->order = 0;
		(*temp2)[position].head = Node;
		(*temp2)[position].tail = Node;
	}else{
		Node->order = (*temp2)[position].tail->order + 1;
		(*temp2)[position].tail->next= Node;
		(*temp2)[position].tail = Node;
	}
	return 0;
}
 
 
int Build_tree(struct _level** TOP, int *level_th, int level_num)//搭建层级结构(树)
{
	Initalize_level(TOP, level_th, NOW_LEVEL);
	return 0;
}
 
 
void Initalize_level(struct _level** HEAD, int *level_th, int now_level_th)//初始化层级结构的每一层
{	
	TIME ++;
	int i = 0;
	(*HEAD) = (struct _level*)malloc(level_th[now_level_th]*sizeof(struct _level));
	for (i=0;i<level_th[now_level_th];i++)
	{
		(*HEAD)[i].level_th = now_level_th;
		(*HEAD)[i].lenth = level_th[now_level_th];
		if (now_level_th == 0) {
			(*HEAD)[i].last_level = NULL;
		}
		else {
			(*HEAD)[i].last_level = *HEAD;
		}
			(*HEAD)[i].head = NULL;
			(*HEAD)[i].tail = NULL;
		if (now_level_th<LEVEL) {
			(*HEAD)[i].next_level = (struct _level**)malloc(level_th[now_level_th+1] * sizeof(struct _level*));
				NOW_LEVEL++;
				Initalize_level(&((*HEAD)[i].next_level[0]), level_th, now_level_th+1);
				NOW_LEVEL--;
		}
		else {
			(*HEAD)[i].next_level = NULL;
		}
	}	 	
}

输出结果-----result.txt

 >>递归遍历

Lev= 0 - Pos= 0 -Node= A	NUM= 1

	Lev= 1 - Pos= 0 -Node= B	NUM= 1

		Lev= 2 - Pos= 0 -Node= D	NUM= 1
		Lev= 2 - Pos= 1 -Node=  	NUM= 1
	Lev= 1 - Pos= 1 -Node= C	NUM= 1

		Lev= 2 - Pos= 0 -Node=  	NUM= 1
		Lev= 2 - Pos= 1 -Node=  	NUM= 1
 >>非递归遍历
A"B","D"," ","C"," "," ",

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值