【数据结构之树】初阶数据结构之树的实现及其各种方式(上)

这篇具有很好参考价值的文章主要介绍了【数据结构之树】初阶数据结构之树的实现及其各种方式(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


😏专栏导读

👻作者简介:M malloc,致力于成为嵌入式大牛的男人
👻专栏简介:本文收录于 初阶数据结构,本专栏主要内容讲述了初阶的数据结构,如顺序表,链表,栈,队列等等,专为小白打造的文章专栏。
👻相关专栏推荐:LeetCode刷题集,C语言每日一题。


🤖文章导读

本篇文章我将详细的讲解关于树的知识点
【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法

🙀树的预备知识

前情介绍

对于大量的输入数据,链表的线性访问时间太慢,不宜使用。本片文章,我将讲述一种简单的数据结构,其大部分操作的时间复杂度为O(log n)。


树(tree)可以用几种方式定义。定义树的一种自然的方式是递归的方法。一棵树是一些节点的集合。这个集合可以是空集;若非空,则一棵树由称做根(root)的节点r以及0个或多个非空的(子)树 T1,T2,…,T 组成,这些子中每一的根都被来自根的一条有向的边(edge)所连接。

每一棵子树的根叫做根r的儿子(child)而r每一棵子的根的父亲(parent)。下图是显示用递归定义的典型的树。
【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法


从递归定义中我们发现,一棵树是 N 个节点和N - 1条边的集合,其中的一个节点叫做。存在 N -1条边的结论是由下面的事实得出的,每条边都将某个节点连接到它的父亲,而除去根节点外每一个节点都有一个父亲,如下图所示。

【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法
根节点,父亲节点,叶子节点,兄弟节点的详解

在上图的树中,节点A是根结点,节点F有一个父亲A并且有儿子K、L、M。每一个节点可以有任意多个儿子,也可以没有儿子也就是0个,但是只能有一个父亲。没有儿子的节点成为叶子节点(leaf);上图的叶子节点是B,C,H,I,P,Q,K,L,M和N。具有相同父亲的节点称为兄弟节点(sibing);因此K、L和M都是兄弟。


深度(depth)

首先,根的深度为0。在上图中E节点的深度为1,但是高为2,F的深度为1,高为1,该树的高为3,一个树的深度等于它的最深的树叶的深度;该深度总是等于这颗树的高。

🙀二叉树

二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的儿子。

【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法

二叉树的一个性质是平均二叉树的深度要比 N 小得多这个性质有时很重要。分析表明,这个平均深度为 O(/N).而对于特殊类型的二叉树,即二叉查找树(binary search tree)其深度的平均值是 O(log N)。不幸的是,正如下图中的例子所示,这个深度是可以大到 N -1的。

最坏情况的二叉树
【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法

😳树的代码实现及其各类讲解

🌲树的结构体初始化

树的结构

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

二叉树,顾名思义就是一个左子树,一个右子树,所以在这里我们定义了一个结构体类型的左子树和右子树。那么是不是还要存放数据呢?对的没错!所以还需要一个数据域data


手动创建一个树和开辟新节点

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

在上述代码中运用到了malloc这个库函数。这是在堆上动态开辟一块区域,把我们想要存入的值再放进去。

BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode * node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	BTNode* node7 = BuyNode(7);
	BTNode* node8 = BuyNode(8);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	//node5->left = node7;
	node2->right = node7;
	node3->left = node8;

	return node1;
}

上述是手动进行指向节点,就是我们要对应着一幅图进行画它的指向,比如,node1的左边指向node2,就说明node2在node1的左边,然后node1的右边存放着node4,就说明node4的父亲是node1,也就是node4在node1的右边,也就是下图所示

【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法


树的前序遍历

其实在树的前序遍历过程中其实就是递归的过程。有一个很好的口诀,就是中左右,意思就是先遍历根节点,然后在遍历左子树,再从左子树递归下去,右子树也是样的操作。

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return NULL;
	}
	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法


树的中序遍历

那么中序遍历呢?中序遍历的口诀是左中右,就是先遍历左子树,在遍历根节点,右子树。就是这样的一系列的操作就行啦

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return NULL;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

【数据结构之树】初阶数据结构之树的实现及其各种方式(上),初阶数据结构,数据结构,c,算法


树的后序遍历

后序遍历的自然也是有口诀的啦!我们的口诀是左右中,此时我们的根节点是最后才遍历的不知道你们发现没有!

void taorder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return ;
	}
	taorder(root->left);
	taorder(root->right);
	printf("%d ", root->data);
}

总结

在本片文章中只是粗略的介绍了一下树的前中后序的遍历,其实代码的思路是很简单的就是几个递归的操作,大家多画画递归的展开图就能理解啦!那么这只是树的上篇。在树的下篇中,我将详细讲解怎么利用递归求出树的一系列操作等问题,我是爱你们的M malloc 我们下期再见!文章来源地址https://www.toymoban.com/news/detail-581365.html

到了这里,关于【数据结构之树】初阶数据结构之树的实现及其各种方式(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构初阶--二叉树的链式结构

    目录 一.二叉树链式结构的概念 二.二叉树链式结构的功能实现 2.1.链式二叉树的定义 2.2.链式二叉树的构建 2.3.链式二叉树的遍历 2.3.1.先序遍历 2.3.2.中序遍历 2.3.3.后序遍历 2.3.4.层序遍历 2.4.链式二叉树的求二叉树的结点数量 法一:计数法 法二:分治法 2.5.链式二叉树的求二

    2024年02月12日
    浏览(43)
  • 初阶数据结构之---二叉树的顺序结构-堆

    今天要讲的堆,不是操作系统虚拟进程地址空间中(malloc,realloc等开空间的位置)的那个堆,而是数据结构中的堆,它们虽然名字相同,却是截然不同的两个概念。堆的底层其实是 完全二叉树 ,如果你问我,完全二叉树是什么。好吧,那我先从树开始讲起,开始我们今天的

    2024年03月14日
    浏览(55)
  • 数据结构初阶--二叉树的顺序结构之堆

    目录 一.堆的概念及结构 1.1.堆的概念 1.2.堆的存储结构 二.堆的功能实现 2.1.堆的定义 2.2.堆的初始化 2.3.堆的销毁 2.4.堆的打印 2.5.堆的插入 向上调整算法 堆的插入 2.6.堆的删除 向下调整算法 堆的删除 2.7.堆的取堆顶元素 2.8.堆的判空 2.9.堆的求堆的大小 三.堆的创建 3.1.向上调

    2024年02月14日
    浏览(42)
  • 【初阶数据结构】树结构与二叉树的基础概念

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,今天带来数据结构里的重点内容也是在笔试,面试中的常见考点——树与二叉树,其中二叉树又分为很多种,我们先来讲讲基础的内容带大家一步步入门 在介绍二叉树之前,我们得先知道什

    2024年02月08日
    浏览(38)
  • 数据结构初阶之二叉树的详细解析

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题       数据结构初阶    Linux 欢迎大家点赞,评论,收藏。 一起努力,共赴大厂。 目录 1.前言  2.二叉树各个功能代码实现 2.1二叉树结构体 2.2二叉

    2024年02月05日
    浏览(38)
  • 【初阶数据结构】二叉树的几种遍历详解

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,有了我们之前介绍的树结构与二叉树的基础概念,今天我们来讲讲对二叉树的基本使用——遍历 我们自己先简单链式连接几个结点来创建一个二叉树方便我们之后对遍历的讲解 好了,有了

    2024年02月08日
    浏览(40)
  • 数据结构之树

    1.树定义 树(Tree)是由n(n≥0)个结点组成的有限集合(树中元素通常称为结点)。 n=0的树称为空树;n>0的树T由以下两个条件约定构成: ① 有一个特殊的结点称为根(Root)结点,它只有后继结点,没有前驱结 点。 ② 除根结点之外的其他结点分为m个互不相交的集合T0、T1、…、Tm-

    2024年02月12日
    浏览(42)
  • 《数据结构与算法》之树

    我们在前面的学习中认识到了栈还有队列这些线性的数据存储结构,而现在我们要了解的数据结构却不是线性的了,我们试想线性的结构最大的缺点查询不方便,不管你是从前往后开始查找数据,还是从后往前开始查找数据都是一个一个的比对, 效率很低,所以不推荐使用,

    2024年02月08日
    浏览(206)
  • 【数据结构】非线性结构之树结构(含堆)

    前面的三篇文章已经将线性结构讲述完毕了,下面的文章将会为大家将讲点新东西:非线性结构中的 树结构 。萌新对这里的知识点相对陌生,建议反复观看!! 关于线性结构的三篇文章放在下面: 线性表之顺序表 线性表之链表 线性表之栈、队列 树是一种 非线性 的数据结

    2024年02月15日
    浏览(50)
  • 数据结构之树和森林

      数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包