二叉树的基本操作函数(先、中、后、层次遍历)

//链式二叉树数据结构
typedef struct Node
{
TElemType data;//数据域
struct Node* lchild, * rchild;//左右孩子
}Node, * Tree;

#include <queue>
#define TElemType int		//方便 应用的时候 改

//链式二叉树数据结构
typedef struct Node
{
	TElemType data;//数据域
	struct Node* lchild, * rchild;//左右孩子
}Node, * Tree;
//********************************基本操作函数********************************//
//创建二叉树 规定数据域为-1,则为空 先序创建
int InitTree(Tree& T)
{
	TElemType a;
	scanf("%d", &a);
	if (-1 == a) T = NULL;
	else {
		T = (Tree)malloc(sizeof(Node));
		T->data = a;
		InitTree(T->lchild);
		InitTree(T->rchild);
	}
	return 0;
}
//先序遍历-递归
//先序遍历 按照逻辑来说,执行这个函数前,应该进行逻辑判断(树是否为空),放在里面的话也没有else进行输出提示,不太好
//这里就按照课本敲代码了,在对应功能实现函数进行逻辑判断
void PreOrder(Tree T)
{
	if (T != NULL)
	{
		printf("%d ", T->data);
		PreOrder(T->lchild);//递归先序遍历左右子树
		PreOrder(T->rchild);
	}
}
//中序遍历-递归
void InOrder(Tree T)
{
	if (T != NULL)
	{
		InOrder(T->lchild);//递归中序遍历左右子树
		printf("%d ", T->data);
		InOrder(T->rchild);
	}
}
//后序遍历-递归
void PostOrder(Tree T)
{
	if (T != NULL)
	{
		PostOrder(T->lchild);//递归后序遍历左右子树
		PostOrder(T->rchild);
		printf("%d ", T->data);
	}
}
//层序遍历
void LevelOrder(Tree T)
{
	queue<Node> q;//借助队列
	if (T != NULL)
	{
		Node temp;//暂存要出队的结点
		q.push(*T);//根结点入队
		while (!q.empty())//队列非空
		{
			temp = q.front();
			q.pop();
			printf("%d ", temp.data);
			if (temp.lchild != NULL) q.push(*temp.lchild);//队列先进先出,先入左孩子
			if (temp.rchild != NULL) q.push(*temp.rchild);
		}
	}
}
//**********************************功能实现函数*****************************//
//调用InitTree
void CreateBiTree(Tree& T)
{
	printf("请按照先序遍历输入二叉树(-1无):");
	InitTree(T);
	printf("二叉树先序遍历序列:");
	PreOrder(T);
	printf("\n");
}
//遍历功能函数 调用PreOrder InOrder PostOrder LevelOrder
void Traverse(Tree T)
{
	int choice;
	while (1)
	{
		printf("********1.先序遍历    2.中序遍历*********\n");
		printf("********3.后序遍历    4.层次遍历*********\n");
		printf("********5.返回上一单元\n");
		printf("请输入菜单序号:\n");
		scanf("%d", &choice);
		if (5 == choice) break;
		switch (choice)
		{
		case 1: {printf("二叉树先序遍历序列:"); PreOrder(T); printf("\n"); }break;
		case 2: {printf("二叉树中序遍历序列:"); InOrder(T); printf("\n"); }break;
		case 3: {printf("二叉树后序遍历序列:"); PostOrder(T); printf("\n"); }break;
		case 4: {printf("二叉树层次遍历序列:"); LevelOrder(T); printf("\n"); }break;
		default:printf("输入错误!!!\n"); break;
		}
	}
}
//菜单
void menu()
{
	printf("********1.创建    2.遍历*********\n");
	printf("********3.退出\n");
}
//主函数
int main()
{
	Tree T = NULL; int choice = 0;
	while (1)
	{
		menu();
		printf("请输入菜单序号:\n");

		scanf("%d", &choice);
		if (3 == choice) break;
		switch (choice)
		{
		case 1:CreateBiTree(T); break;
		case 2:Traverse(T); break;
		default:printf("输入错误!!!\n"); break;
		}
	}
	return 0;
}

请添加图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值