0
点赞
收藏
分享

微信扫一扫

数据结构(C语言)动态创建二叉树及三种方式输出二叉树

念川LNSC 2022-05-06 阅读 60
数据结构

任务:动态创建一个如图所示的树,并且用三种方式(前、中、后序)输出结果;

一、节点

typedef struct Tree{
	int data;
	struct Tree * plchild;//左指针域 
	struct Tree * prchild;//右指针域 
}TREE,*PTREE;

二、动态创建树函数

思路:
    创建树函数,本质上是递归,返回根节点的地址。
    根节的点左树和右树也可以有左树和右树,意味着可以递归使用创建树函数;
    如果不需要创建子树,输入一个-1表示不用创建即可;
PTREE creat_tree(void){

	int data;
	scanf("%d",&data);
	PTREE p = (PTREE)malloc(sizeof(TREE));
	PTREE prot = p;//第一个根节点的地址另外保存 
	p->data = data;
	
	if(data == -1){
		return NULL;
	}else{
		
		printf("请输入%d左子树(输入-1代表不用创建): ",data);
		p->plchild = creat_tree();//新创建树,将地址赋值给根节点的左指针域
		printf("请输入%d右子树(输入-1代表不用创建): ",data);
		p->prchild = creat_tree();//新创建树,将地址赋值给根节点的右指针域

		return prot;
	}
	
}

三、前序遍历(中、后序一样的)

前:

思路:递归
1.访问根节点
2.前序遍历根结点左子树
3.前序遍历根节点右子树
void pre_traverse(PTREE p){
	
	if(p==NULL){
		return; 
	}else{
		printf("%d",p->data);
		if(p->plchild != NULL){
			pre_traverse(p->plchild);
		}
		if(p->prchild != NULL){
			pre_traverse(p->prchild);
		}
	}
}

中:

思路:递归
1.中序遍历根结点左子树
2.访问根节点
3.中序遍历根节点右子树
void in_traverse(PTREE p){

	if(p==NULL){
		return; 
	}else{
		if(p->plchild != NULL){
			in_traverse(p->plchild);
		}
		printf("%d",p->data);
		if(p->prchild != NULL){
			in_traverse(p->prchild);
		}
	}
}

后;

思路:递归
1.后序遍历根结点左子树
2.后序遍历根节点右子树
3.访问根节点
void end_traverse(PTREE p){
	
	if(p==NULL){
		return; 
	}else{
		if(p->plchild != NULL){
			end_traverse(p->plchild);
		}
		if(p->prchild != NULL){
			end_traverse(p->prchild);
		}
		printf("%d",p->data);
	}
}

四、主函数代码:

#include <stdio.h>
#include <malloc.h>

typedef struct Tree{
	int data;
	struct Tree * plchild;//左指针域 
	struct Tree * prchild;//右指针域 
}TREE,*PTREE;

PTREE creat_tree(void);
void pre_traverse(PTREE p);
void in_traverse(PTREE p);
void end_traverse(PTREE p);

int main(void){
	printf("请输入第一个节点的数据:\n");
	PTREE p = creat_tree();
	
	printf("前序输出的结果是:\n");
	pre_traverse(p);
	
	printf("\n中序输出的结果是:\n");
	in_traverse(p);
	
	printf("\n后序输出的结果是:\n");
	end_traverse(p);
	
	return 0;
}

运行结果:

 

举报

相关推荐

0 条评论