小白莲的数据结构day08

二叉树的创建与遍历(链式结构)

大家好,我是小白莲
今天小白莲学会了二叉树的结构定义,创建、遍历,不要觉得二叉树很难,其实就是递归的应用。
好,废话少说,往下看吧。

1.二叉树结构的定义

指针域为左右两个孩子

//包含头文件
#include<stdio.h>
#include<stdlib.h>

//定义常量

#define OK 1
#define ERRROR 0
#define OVERFLOW -2
typedef  char TElemType;
typedef int Status;

//定义二叉树链表的结构
typedef  struct BiTNode {
	TElemType	data;	//数据域
	struct BiTNode* lchild;	//左孩子指针域
	struct BiTNode* rchild;	//右孩子指针域
}BiTNode,*BiTree;

2.二叉树的创建

//按前序创建一个二叉树
void CreateBiTree(BiTree& tree) {
	//依次输入字符创建二叉树,以'#'为空结点字符
	TElemType s;
	scanf_s("%c",&s);
	if (s == '#')
		tree = NULL;
	else
	{
		//给结点申请空间
		tree = (BiTree)malloc(sizeof(BiTNode));
		if (!tree)	exit(OVERFLOW);	//申请存储空间失败
		//给结点赋值
		tree->data = s;//生成根节点
		CreateBiTree(tree->lchild);//构造左子树
		CreateBiTree(tree->rchild);//构造右子树
	}
}

3.二叉树的遍历

3.1前序遍历法

//按前序遍历法,输出二叉树的所有元素
void PrePrint(BiTree tree) {
	if (!tree)
		return;
	printf("%c", tree->data);
	PrePrint(tree->lchild);	//输出左子树的元素
	PrePrint(tree->rchild);	//输右左子树的元素
}

3.2中序遍历法

//按中序遍历法,输出二叉树的所有元素
void InPrint(BiTree tree) {
	//如果当前孩子域为空,返回上一步操作
	if (!tree)
		return;
	//进行中序遍历
	InPrint(tree->lchild);	//输出左子树的元素
	printf("%c", tree->data);
	InPrint(tree->rchild);	//输右左子树的元素
}

3.3后序遍历法

//按后序遍历法,输出二叉树的所有元素
void LastPrint(BiTree tree) {
	//若果当前孩子域为空,返回上一步操作
	if (!tree)
		return;
	//进行后序遍历
	LastPrint(tree->lchild);	//输出左子树的元素
	LastPrint(tree->rchild);	//输出左子树的元素
	printf("%c", tree->data);
}

4.测试

//测试
int main() {

	BiTree btree;
	//创建一颗二叉树,前序构造,输入的值为:
	//ABDGK###H##E##CFI##J###

	//调用CreateBiTree函数(前序法)创建二叉树,并输入值
	CreateBiTree(btree);
	调用PrePrint函数(前序法),输出二叉树的所有元素,
	若为ABDGKHECFIJ 则输出成功
	printf("前序:\n");
	PrePrint(btree);
	printf("\n");

	调用InPrint函数(中序法),输出二叉树的所有元素,
	若为KGDHBEAIFJC 则输出成功
	printf("中序:\n");
	InPrint(btree);
	printf("\n");

	//调用LastPrint函数(后序法),输出二叉树的所有元素,
	//若为KGHDEBIJFCA 则输出成功
	printf("后序:\n");
	LastPrint(btree);
	printf("\n");
	return 0;
}

4.1测试结果

在这里插入图片描述

具体的树,大家可以自己根据前序加中序或者后序加中序把树画出来,不多,五层的树而已,哈哈,小白的话最好动手试试,想对答案的可以联系我

end

给人点赞,手留余香

预知后续操作如何,请看下集

@author 白莲居仙 QQ:1131977233

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值