二叉链表树

二叉链表树

定义常量

/*一些经常用到的头文件,预定义常量等*/
//常用头文件
#include 
#include 
#include 
#include 
#include 
//函数结果状态代码
#define TRUE	1
#define FALSE	0
#define OK		1
#define ERROR	0
#define INFEASIBLE	0
//新建函数类型,表示函数运行结果
typedef int Status;

结构体定义和函数声明

typedef int TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

Status CreateBiTree(BiTree *T);
Status BiTreeEmpty(BiTree T);
Status PreOrderTraverse(BiTree T, Status (*visit)(TElemType e));
Status InOrderTraverse(BiTree T, Status (*visit)(TElemType e));
Status PostOrderTraverse(BiTree T, Status (*visit)(TElemType e));

Status visit(TElemType e);

函数定义

//先序创建二叉树 
Status CreateBiTree(BiTree *T)
{
	TElemType val;
	scanf("%d", &val);
	if(val == -1)
		*T = NULL;
	else
	{
		*T = (BiTree)malloc(sizeof(BiTNode));
		if(!(*T))	exit(-1);
		(*T)->data = val;
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
	return OK;
}

//判空 
Status BiTreeEmpty(BiTree T)
{
	if(T)	return FALSE;
	else	return TRUE;
}

//先序遍历 递归 
Status PreOrderTraverse(BiTree T, Status (*visit)(TElemType e))
{
	//设立递归边界 
	if(!T)
		return ERROR;
	//遍历当前节点
	printf("%d ", T->data); 
	//遍历左子树 
	if(T->lchild)
		PreOrderTraverse(T->lchild, visit);
	//遍历右子树 
	if(T->rchild)
		PreOrderTraverse(T->rchild, visit);
		
	return OK;	
 } 
 
//中序遍历 递归
Status InOrderTraverse(BiTree T, Status (*visit)(TElemType e))
{
	//设立递归边界
	if(!T)	
		return ERROR;
	//遍历左子树
	if(T->lchild)	
		InOrderTraverse(T->lchild, visit);
	//遍历当前节点
	printf("%d ", T->data);
	//遍历右子树
	if(T->rchild)
		InOrderTraverse(T->rchild, visit);
	return OK; 
}

//后序遍历 递归
Status PostOrderTraverse(BiTree T, Status (*visit)(TElemType e))
{
	//设立递归边界
	if(!T)	
		return ERROR;
	//遍历左子树
	if(T->lchild)	
		PostOrderTraverse(T->lchild, visit);
	//遍历右子树
	if(T->rchild)
		PostOrderTraverse(T->rchild, visit);
	//遍历当前节点
	printf("%d ", T->data);
	return OK; 
}

测试

int main()
{
	BiTree T = NULL;
	//判空 
	if(BiTreeEmpty(T))		printf("空二叉树!\n");
	else					printf("非空二叉树!\n");
	//前序创建二叉树
	printf("前序创建二叉树:");
	CreateBiTree(&T);
	//判空 
	if(BiTreeEmpty(T))		printf("空二叉树!\n");
	else					printf("非空二叉树!\n");
	//遍历 
	printf("\n前序遍历:");
	PreOrderTraverse(T, visit);
	printf("\n中序遍历:");
	InOrderTraverse(T, visit);
	printf("\n后序遍历:");
	PostOrderTraverse(T, visit);
	return 0;
}

Status visit(TElemType e)
{
	printf("%d ", e);
	return OK;
}

运行结果

二叉链表树_第1张图片

你可能感兴趣的:(数据结构)