数据结构(C语言版)——二叉树链式存储以及前序、中序、后序遍历(代码版)

一、代码

#include 
#include 

#define OK 1
#define ERROR 0

typedef int Status;

typedef struct node{
	char data;
	struct node *leftChild,*rightChild;
}biTreeNode,*TREEPOINTER;
 
int printMenu(void);
Status PleaseInit(void);
Status createBiTree(TREEPOINTER* T);
Status createBiTreeImportant(TREEPOINTER* T);
void preOrderTraverse(const TREEPOINTER* T);
Status pre(const TREEPOINTER* T);
void inOrderTraverse(const TREEPOINTER* T);
Status btm(const TREEPOINTER* T);
void postOrderTraverse(const TREEPOINTER* T);

int main(int argc, char *argv[]) {
	int menuChoice;
	TREEPOINTER treePointer;//声明变量 
	treePointer=NULL;
	
	while(menuChoice=printMenu())
		{
				switch(menuChoice)
				{

					case 1:
						createBiTree(&treePointer);
						break;
					case 2:
						pre(&treePointer);
						break;
					case 3:
					   front(&treePointer);
						break;
					case 4:
						btm(&treePointer);
						break;
				}
		}
	return 0;
}

//打印菜单
int printMenu(void)
{
	int choice;
	
	printf("****************二叉树的链式存储练习******************\n");
	printf("1:创建二叉树\n");
	printf("2:前序遍历\n");
	printf("3:中序遍历\n");
	printf("4:后序遍历\n");
	printf("按下0退出程序\n"); 
	printf("*******************************************\n");
	printf("请选择:");
	scanf("%d",&choice);
	return choice;
}



//1:创建二叉树
Status createBiTree(TREEPOINTER* T)
{
	system("cls");//清屏
	printf("当前选的为--1:创建二叉树--\n");
	if((*T)!=NULL)
	{
		printf("请勿重复创建\n");
		return ERROR;
	}
	printf("请以前序遍历的方式输入元素值:");
	createBiTreeImportant(T);
	printf("创建成功!\n");
	return OK;	
}
Status createBiTreeImportant(TREEPOINTER* T)
{
	
	char data;
	scanf("	%c",&data);
	if(data=='#')
	{
		*T=NULL;
	}else{
		(*T)=(TREEPOINTER)malloc(sizeof(biTreeNode));
		if((*T)==NULL)
			return;
		(*T)->data=data;
		createBiTreeImportant(&(*T)->leftChild);
		createBiTreeImportant(&(*T)->rightChild); 
	}
}

//2:前序遍历
Status pre(const TREEPOINTER* T)
{
	system("cls");//清屏
	printf("当前选的为--2:前序遍历--\n");
	if(*T==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	printf("前序遍历的结果为:");
	preOrderTraverse(T);
	printf("\n");
	return OK;
}
void preOrderTraverse(const TREEPOINTER* T)
{
	if(*T==NULL)
		return;
	printf("%c",(*T)->data);
	preOrderTraverse(&(*T)->leftChild);
	preOrderTraverse(&(*T)->rightChild);
}

//3:中序遍历
Status front(const TREEPOINTER* T)
{
	system("cls");//清屏
	printf("当前选的为--3:中序遍历--\n");
	if(*T==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	printf("中序遍历的结果为:");
	inOrderTraverse(T);
	printf("\n");
	return OK;
}
void inOrderTraverse(const TREEPOINTER* T)
{
	if((*T)==NULL)
		return;
	inOrderTraverse(&(*T)->leftChild);
	printf("%c",(*T)->data);
	inOrderTraverse(&(*T)->rightChild);
}

//4:后序遍历
Status btm(const TREEPOINTER* T)
{
	system("cls");//清屏
	printf("当前选的为--4:后序遍历--\n");
	if(*T==NULL)
	{
		PleaseInit();
		return ERROR;
	}
	printf("后续遍历的结果为:");
	postOrderTraverse(T);
	printf("\n");
	return OK;
}
void postOrderTraverse(const TREEPOINTER* T)
{
	if((*T)==NULL)
		return;
	postOrderTraverse(&(*T)->leftChild);
	postOrderTraverse(&(*T)->rightChild);
	printf("%c",(*T)->data);
}

//请先初始化样式
Status PleaseInit(void)
{
		printf("**************\n");
		printf("*请先创建二叉树  *\n");
		printf("**************\n\n");
}

二、代码中重要的函数或语句

(一)、

typedef struct node{
	char data;
	struct node *leftChild,*rightChild;
}biTreeNode,*TREEPOINTER;

上面定义的结构如下图
在这里插入图片描述
(二)、创建二叉树

Status createBiTreeImportant(TREEPOINTER* T)
{
	
	char data;
	scanf("	%c",&data);
	if(data=='#')
	{
		*T=NULL;
	}else{
		(*T)=(TREEPOINTER)malloc(sizeof(biTreeNode));
		if((*T)==NULL)
			return;
		(*T)->data=data;
		createBiTreeImportant(&(*T)->leftChild);
		createBiTreeImportant(&(*T)->rightChild); 
	}
}

在创建二叉树时,该函数很重要。其中空树用#号表示,然后就用前序遍历方式进行存储数据。该函数整体就是递归。
(三)、前中后遍历
它们主要的差别在于printf出现的前后次序不同。

三、运行截图

创建如下的二叉树,并进行前中后遍历
数据结构(C语言版)——二叉树链式存储以及前序、中序、后序遍历(代码版)_第1张图片
数据结构(C语言版)——二叉树链式存储以及前序、中序、后序遍历(代码版)_第2张图片
前序
数据结构(C语言版)——二叉树链式存储以及前序、中序、后序遍历(代码版)_第3张图片
中序
数据结构(C语言版)——二叉树链式存储以及前序、中序、后序遍历(代码版)_第4张图片
后续
数据结构(C语言版)——二叉树链式存储以及前序、中序、后序遍历(代码版)_第5张图片

如有错误欢迎指出

你可能感兴趣的:(数据结构,二叉树,链式存储,前序遍历,中序遍历,后序遍历)