数据结构小练习--树

本文介绍了在C语言基础之上,对数据结构中的树进行练习,包括树的两种存储方式(数组顺序存储和链式存储)以及四种遍历方法(先序、中序、后续和层次遍历)。文章提供了树的创建及遍历的递归实现,并分享了作者S学长的嵌入式开发经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

本系列是C语言学完的基础上,对数据结构的一些练习,代码偏多。
注意啦:每日一看

数据结构:
1.逻辑结构(关系)

线性结构:线性表  栈  队列
非线性结构: **树**    图

2.存储结构:

 顺序存储
 链式存储

注意啦:以下是本人介绍哦
📕作者简介:S学长,致力于C/C++、嵌入式。从事嵌入式行业,热爱健身,身体倍棒的一位博主。
📗本文收录于爱上Linux系列,大家有兴趣的可以看一看
📘相关专栏C语言嵌入式开发、C语言入门系列等,日常Bug集期待你的指导。
📙S学长爱上Linux系列正在发展中,喜欢嵌入式的朋友们可以关注一下哦!


概念理解: 终端结点、分支结点(根节点、内部结点)、度、深度、有序树、森林、父子兄弟结点、路径边数、前驱后继。

1.树的两种存储方式

1>以数组进行,顺序存储。在树的结点较少时浪费了较多的空间。
2>链式存储,父节点左右孩子两个指针。
通常情况下我们采取第二种。
数据结构:

typedef struct btreenode {
	datetype_bt data;
	struct  btreenode* lchile, * rchild;
}btree_node,*btree_pnode;

2.功能函数

2.1树的创建

采取递归方式

scanf("%c",&data);
	if (data == '#')
		return NULL;
	else {
		t = (btree_pnode)malloc(sizeof(btree_node));
		if (t == NULL) {
			perror("malloc");
			return NULL;
		}
		t->data = data;
        //左右子树
		t->lchile = btree_creat();
		t->rchild = btree_creat();
		return t;
	}

2.2 不同遍历

以根为基准元素。采取递归方式。

1. 先序(根左右)

void per_traver(btree_pnode t) {
		if (t != NULL) {
			printf("%c", t->data);
			per_traver(t->lchile);
			per_traver(t->rchild);

		}
	}

中序(左根右)

void mid_traver(btree_pnode t) {
		if (t != NULL) {

			mid_traver(t->lchile);
			printf("%c", t->data);
			mid_traver(t->rchild);

		}
	}

后续(左右根)

void post_traver(btree_pnode t) {
		if (t != NULL) {
			post_traver(t->lchile);
			post_traver(t->rchild);
			printf("%c", t->data);

		}
	}

层次

结合栈,讲自己的左右孩子压入栈中,然后层层递归出栈。

void level_traver(btree_pnode t) {
		link_pqueue q;
		linkqueue_init(&q);
		while (t != NULL) {
			printf("%c", t->data);
			if (t->lchile) {
				linkqueue_in(q, t->lchile);
			}
			if (t->rchild) {
				linkqueue_in(q, t->rchild);
			}
			if (!linkqueue_is_empty(q)) {
				linkqueue_out(q,&t);
				continue;
			}
			else
			{
				break;
			}
		}
	}

遍历函数

将上面几个函数进行整合

void travel(char* str, btree_pnode p, void(*btree_traver)(btree_pnode)) {
		printf("%s:\n", str);
		btree_traver(p);
		putchar('\n');
	}

如果这份博客对大家有帮助,希望各位给S学长一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给S学长的意见,欢迎评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不二哈_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值