深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

这篇具有很好参考价值的文章主要介绍了深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二叉树(1):深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客

二叉树(2):深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度-CSDN博客

前言:

在前面我们讲了堆及其应用,帮助我们初步了解了二叉树的一些原理,但那与真正的二叉树仍有不同,今天我们就来正式学习一下二叉树的基本结构及其基本操作

目录

一、什么是二叉树?

二、二叉树的节点结构

三、二叉树的遍历

前序遍历:

中序遍历:

后序遍历:

四、二叉树的基本操作

1、创建二叉树

2、前序、中序、后序

3、求二叉树的节点个数

4、求二叉树叶子节点的个数

5、树的高度

6、二叉树第k层的节点个数

7、二叉树查找值为x的节点

五、完整代码实例

总结


一、什么是二叉树?

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

在前面的文章中我们已经提到过二叉树的结构及其特点,这里我们不过多赘述,有不理解的可以点文章开头的链接去前面看一下

二、二叉树的节点结构

二叉树有左右子树之分,且二叉树与我们所学的其他数据结构不同的点在于,之前我们所学的都是各类插入或者删除等等,但是二叉树需要做的操作是运用递归遍历,所以二叉树的节点结构与之前几个有很大不同

typedef int TreeDataType;
typedef struct Tree
{
	TreeDataType a;
	struct Tree* left;
	struct Tree* right;
}Tree;

节点结构里面定义有两个递归,是为了方便后面的遍历

三、二叉树的遍历

二叉树的遍历是我们学习二叉树首先要了解的东西,我们都知道二叉树其实就是一串数组,那我们是如何访问他们的呢?这里就牵扯到了遍历顺序的问题。

二叉树的遍历有三种形式:前序、中序和后序

  1. 前序遍历:

    • 特点:按照“根-左-右”的顺序遍历二叉树。
    • 特点:首先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
    • 应用:常用于复制一棵树、计算表达式的值等。
  2. 中序遍历:

    • 特点:按照“左-根-右”的顺序遍历二叉树。
    • 特点:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。
    • 应用:常用于二叉搜索树,可以得到一个递增的有序序列。
  3. 后序遍历:

    • 特点:按照“左-右-根”的顺序遍历二叉树。
    • 特点:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
    • 应用:常用于释放二叉树的内存空间,或者计算表达式的值。

    例如:深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

四、二叉树的基本操作

我先把主函数给出,接下来就将按照主函数中的这些功能一步一步来实现

int main()
{
	Tree* root = CreatTree();
	//前序
	printf("前序:");
	PrevTree(root);
	printf("\n");
	//中序
	printf("中序:");
	HalfTree(root);
	printf("\n");
	//后序
	printf("后序:");
	PostTree(root);
	printf("\n");
	//节点个数
	int count = BTreeSize(root);
	printf("BTreeSize:%d\n", count);
	//叶子节点个数
	printf("BTreeLeafSize:%d\n", BTreeLeafSize(root));
	//树的高度
	printf("BTreeHigh:%d\n", BTreeHigh(root));
	//二叉树第k层节点个数
	printf("BTreeLevelKSize:%d\n", BTreeLevelKSize(root, 3));
	//二叉树查找值为x的节点
	

    return 0;
}

1、创建二叉树

//二叉树
typedef int TreeDataType;
typedef struct Tree
{
	TreeDataType a;
	struct Tree* left;
	struct Tree* right;
}Tree;
//初始化二叉树
Tree* TreeInit(TreeDataType x)
{
	Tree* m = (Tree*)malloc(sizeof(Tree));
	if (m == NULL)
	{
		perror("TreeInit");
		return NULL;
	}
	m->a = x;
	m->left = NULL;
	m->right = NULL;
	return m;
}
//创建一个二叉树
Tree* CreatTree()
{
	Tree* n1 = TreeInit(3);
	Tree* n2 = TreeInit(5);
	Tree* n3 = TreeInit(6);
	Tree* n4 = TreeInit(7);
	Tree* n5 = TreeInit(9);

	n1->left = n2;
	n1->right = n3;
	n2->left = n4;
	n2->right = n5;

	return n1;
}

2、前序、中序、后序

前序、中序和后序其实就是数据按照上面图片中的形式进行遍历

//前序
void PrevTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->a);
	PrevTree(root->left);
	PrevTree(root->right);
}
//中序
void HalfTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	HalfTree(root->left);
	printf("%d ", root->a);
	HalfTree(root->right);
}
//后序
void PostTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PostTree(root->left);
	PostTree(root->right);
	printf("%d ", root->a);
}

运行结果:

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

3、求二叉树的节点个数

//二叉树节点个数
int BTreeSize(Tree* root)
{
	//分治的思想
	if (root == NULL)
	{
		return 0;
	}
	return BTreeSize(root->left) + BTreeSize(root->right)+1 ;
}

用到了递归的思想,下面的内容都要用递归来解决,如果递归学的不太好建议画图来看这些过程如何进行的

运行结果:

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

4、求二叉树叶子节点的个数

//二叉树叶子节点个数
int BTreeLeafSize(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BTreeLeafSize(root->left) + BTreeLeafSize(root->right);
}

运行结果:

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

5、树的高度

//求二叉树高度
int BTreeHigh(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftHigh = BTreeHigh(root->left);
	int rightHigh = BTreeHigh(root->right);

	return leftHigh > rightHigh ? leftHigh + 1 : rightHigh + 1;
}

运行结果:

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

6、二叉树第k层的节点个数

//二叉树第k层节点个数
int BTreeLevelKSize(Tree* root, int k)
{
	assert(k > 0);
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}

运行结果:

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

7、二叉树查找值为x的节点

//二叉树查找值为x的节点
Tree* BTreeFind(Tree* root,int x)
{
	if (root == NULL)
		return NULL;
	if (root->a == x)
		return root;
	Tree* ret1 = BTreeFind(root->left, x);
	if (ret1)
	{
		return ret1;
	}
	Tree* ret2 = BTreeFind(root->right, x);
	if (ret2)
	{
		return ret2;
	}
}

五、完整代码实例

//二叉树
typedef int TreeDataType;
typedef struct Tree
{
	TreeDataType a;
	struct Tree* left;
	struct Tree* right;
}Tree;
//初始化二叉树
Tree* TreeInit(TreeDataType x)
{
	Tree* m = (Tree*)malloc(sizeof(Tree));
	if (m == NULL)
	{
		perror("TreeInit");
		return NULL;
	}
	m->a = x;
	m->left = NULL;
	m->right = NULL;
	return m;
}
//创建一个二叉树
Tree* CreatTree()
{
	Tree* n1 = TreeInit(3);
	Tree* n2 = TreeInit(5);
	Tree* n3 = TreeInit(6);
	Tree* n4 = TreeInit(7);
	Tree* n5 = TreeInit(9);

	n1->left = n2;
	n1->right = n3;
	n2->left = n4;
	n2->right = n5;

	return n1;
}
//前序
void PrevTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->a);
	PrevTree(root->left);
	PrevTree(root->right);
}
//中序
void HalfTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	HalfTree(root->left);
	printf("%d ", root->a);
	HalfTree(root->right);
}
//后序
void PostTree(Tree* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PostTree(root->left);
	PostTree(root->right);
	printf("%d ", root->a);
}
//二叉树节点个数
int BTreeSize(Tree* root)
{
	//分治的思想
	if (root == NULL)
	{
		return 0;
	}
	return BTreeSize(root->left) + BTreeSize(root->right)+1 ;
}
//二叉树叶子节点个数
int BTreeLeafSize(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BTreeLeafSize(root->left) + BTreeLeafSize(root->right);
}
//求二叉树高度
int BTreeHigh(Tree* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftHigh = BTreeHigh(root->left);
	int rightHigh = BTreeHigh(root->right);

	return leftHigh > rightHigh ? leftHigh + 1 : rightHigh + 1;
}
//二叉树第k层节点个数
int BTreeLevelKSize(Tree* root, int k)
{
	assert(k > 0);
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}
//二叉树查找值为x的节点
Tree* BTreeFind(Tree* root,int x)
{
	if (root == NULL)
		return NULL;
	if (root->a == x)
		return root;
	Tree* ret1 = BTreeFind(root->left, x);
	if (ret1)
	{
		return ret1;
	}
	Tree* ret2 = BTreeFind(root->right, x);
	if (ret2)
	{
		return ret2;
	}
}
int main()
{
	Tree* root = CreatTree();
	//前序
	printf("前序:");
	PrevTree(root);
	printf("\n");
	//中序
	printf("中序:");
	HalfTree(root);
	printf("\n");
	//后序
	printf("后序:");
	PostTree(root);
	printf("\n");
	//节点个数
	int count = BTreeSize(root);
	printf("BTreeSize:%d\n", count);
	//叶子节点个数
	printf("BTreeLeafSize:%d\n", BTreeLeafSize(root));
	//树的高度
	printf("BTreeHigh:%d\n", BTreeHigh(root));
	//二叉树第k层节点个数
	printf("BTreeLevelKSize:%d\n", BTreeLevelKSize(root, 3));
	//二叉树查找值为x的节点
	

    return 0;
}

运行结果:

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作,数据结构,算法,c语言

总结

总而言之,二叉树其实是对我们运用递归来遍历数据的考察,由于篇幅原因,这里我们只对二叉树的结构进行了大致的讲解,有不理解的地方欢迎与我私信或者在评论区中指出

创作不易,还请各位大佬点个小小的赞!!!文章来源地址https://www.toymoban.com/news/detail-844988.html

到了这里,关于深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【夜深人静学数据结构与算法 | 第三篇】 二叉树

    目录  前言:  二叉树: 二叉树的种类:  二叉树的存储方式: 1. 链式存储 2. 数组存储 二叉树的遍历方式 深度优先遍历 广度优先遍历 总结: 本文将会详细的介绍各种常见的树以及相对应的概念,存储方式,遍历方式。树是经典的数据结构,因此我们虽然不能做到手撕各

    2024年02月11日
    浏览(50)
  • (浙大陈越版)数据结构 第三章 树(中) 二叉搜索树和平衡二叉树

    目录 4.1.1 二叉搜索树及查找 什么是二叉搜索树 定义 二叉搜索树特殊函数集: 查找操作:Find 算法思想 代码实现 补:查找最大和最小元素 4.1.2 二叉搜索树的插入 插入操作:Insert 算法思想 代码实现 例题 4.1.3 二叉搜索树的删除 删除操作:delete 算法思想 情况1:删除叶节点

    2024年02月08日
    浏览(54)
  • 【数据结构与算法篇】深入浅出——二叉树(详解)

    ​👻内容专栏:《数据结构与算法专栏》 🐨本文概括: 二叉树是一种常见的数据结构,它在计算机科学中广泛应用。本博客将介绍什么是二叉树、二叉树的顺序与链式结构以及它的基本操作,帮助读者理解和运用这一重要概念。 🐼本文作者: 花 蝶 🐸发布时间:2023.6.5

    2024年02月08日
    浏览(50)
  • 【数据结构】带你深入理解栈

    栈是一种特殊的线性表。其只允许在固定的一端进行插入和删除元素的操作,进行数据的插入和删除的一端称作 栈顶 ,另外一端称作 栈底 。 栈不支持随机访问 ,栈的数据元素遵循 后进先出 的原则,即 LIFO(Late In First Out)。 也许有人曾经听说过 压栈 和 入栈 的术语,以

    2024年02月03日
    浏览(43)
  • 【脚踢数据结构】深入理解栈

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

    2024年02月13日
    浏览(44)
  • 【数据结构】 顺序表详解!深入理解!

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 数据结构解析 🌄 莫道桑榆晚,为霞尚满天! ​ 什么是数据结构?我们为什么要学数据结构?数据结构中的顺序表长什么样子?它是怎么运用? ​ 本期我们将对这些一一讲解,彻底明白数据结构的重要性,以及顺序表是一种什么的数据

    2024年02月08日
    浏览(42)
  • 深入浅出二叉树— C语言版【数据结构】

    目录 ​编辑 1.树概念及结构 1.1树的概念 1.2 树的相关概念 ​1.3 树的表示 2.二叉树概念及结构   2.1概念 2.2 特殊的二叉树 2.3 二叉树的性质  2.4 简单二叉树题目练习  2.5 二叉树的存储结构 2.5.1 顺序存储——堆 2.5.2 链式存储 树是一种 非线性的数据结构 ,它是由n(n=0)个有

    2024年02月03日
    浏览(78)
  • (浙大陈越版)数据结构 第三章 树(上) 3.3 二叉树的遍历

    目录 3.3.1 遍历(先中后) 二叉树的遍历 先序遍历: 中序遍历 后序遍历 tips: 3.3.2 中序非递归遍历 非递归算法实现的基本思路:使用堆栈 中序遍历的非递归算法具体实现方法为: 3.3.3 层序遍历 难点 解决方法: 队列实现 思路 有如下二叉树作为例子: 遍历过程:(出队即

    2024年02月06日
    浏览(47)
  • 【数据结构】深入探讨二叉树的遍历和分治思想(一)

    🚩 纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要讲述二叉树的递归结构及分治算法的思想。  为了实现二叉树的基本操作以及更好的了解二叉树的结构,先手动创造一个链式二叉树。  创建出来的结构: 📗创建出来的这棵二叉

    2024年02月08日
    浏览(42)
  • C/C++数据结构之深入了解树与二叉树:概念、存储结构和遍历

    树是一种常见的数据结构,它在计算机科学和数学中都有广泛的应用。树结构的最简单形式是二叉树,本文将深入探讨树和二叉树的概念、存储结构以及二叉树的遍历,并提供一些实际的代码示例来帮助理解这些概念。 树 (Tree) 树是一种层次性数据结构,由节点(或称为顶点

    2024年02月06日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包