【数据结构】二叉树(Binary Tree)

【数据结构】二叉树详解 树是一种非线性的数据结构,是由多个节点组成的有层次关系的集合,看起来就像一颗倒挂的树,如下图:树中有一个节点没有前驱节点,这个节点称为根节点除根节点外,其余的节点又可以看成多个互不相交的集合,每一个集合就是一颗子树。 阅读详情

文章目录

  • 一、树的概念及结构
  • 二、二叉树的概念及结构
    • 1.二叉树的概念
    • 2.特殊的二叉树
    • 3.二叉树的性质
  • 三、二叉树的存储
    • 顺序存储
    • 链式存储
  • 四、二叉树的实现
    • 1.创建二叉树
    • 2.二叉树的遍历
      • 前序遍历
      • 中序遍历
      • 后序遍历
      • 层序遍历
      • 根据遍历顺序创建二叉树
    • 3.二叉树的基本操作
      • 1.总结点个数
      • 2.二叉树高度
      • 3.第K层结点个数
      • 4.查找
      • 5.判断二叉树是否是完全二叉树
    • 4.销毁二叉树

一、树的概念及结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。它看起来像一棵倒挂的树,根朝上,而叶子朝下,所以我们把它叫做为树。
在这里插入图片描述

根结点:没有前驱结点,是当前树中所有结点的祖先。

除根节点外,其余结点被分成一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。

g)

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的度为3。

叶子节点:度为0的节点称为叶子节点; 如上图:E、F、G为叶子节点。

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点,B是E的父节点。

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的子节点,F是D的子节点。

兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C、D是兄弟节点。

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为3.

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次/深度; 如上图:树的高度为3

堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:E、F互为堂兄弟节点

节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

森林:由m(m>0)棵互不相交的树的集合称为森林;

二、二叉树的概念及结构

1.二叉树的概念

二叉树是一种特殊的树,每个结点最多只能有两个子结点,即二叉树不存在度大于2的结点。
二叉树可以分为三个部分:根、左子树、右子树,每颗子树又可以划分为这三个部分,一直递归到叶子结点,叶子结点是其本身的根结点。
二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
在这里插入图片描述

二叉树有五种基本形态:空树(B的右子树)、只有根节点(D、E、F)、只有左子树(B)、只有右子树、左右子树(A、C)都存在。

2.特殊的二叉树

满二叉树:除了叶子结点之外的所有结点都有两个子结点。如果一个满二叉树的层数为K,那么结点总数是20 + 21 + … + 2k-1 = 2k - 1个。

在这里插入图片描述

完全二叉树:除了最后一层,完全二叉树的每一层从左到右都是满的。也就是说,如果完全二叉树的层数为 h,那么前 h-1 层一定是一个满二叉树。
满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

斜二叉树:除了叶子结点外,所有结点都只有一个结点,且是一个方向的结点,要么都只有左结点,要么都只有右结点。

在这里插入图片描述

3.二叉树的性质

1.任意二叉树第 i 层最多有2i-1个结点。 ( i ≥ \geq ≥ 1)
2.深度为 h 的任意二叉树的最大结点总数为2h-1。( h ≥ \geq ≥ 1)
3.任意二叉树中,度为0的叶子结点个数永远比度为2的结点个数多一个。
4.对于一个有n个结点的满二叉树,其深度 h= l o g 2 log_2 log2​(n+1)(向上取整)

三、二叉树的存储

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

顺序存储

二叉树的顺序结构存储就是使用数组来存储。按照层序遍历的顺序(从上到下,从左到右)依次将结点存储在数组中,如果某个结点的左结点或者右结点不存在,则对应的数组的位置就为空,不存储元素。
在这里插入图片描述

  • 二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
  • 二叉树以数组方式存储,父子结点下标的关系:左结点下标 = 2*父结点下标+1,右结点下标 = 2*父结点下标+2,父结点下标 = (任意孩子结点下标-1)/ 2。
  • 由上图可以看出,如果是非完全二叉树用数组来表示,则会存在空间浪费,所以使用数组一般只适合表示完全二叉树。而对于一般的二叉树,常用链式存储结构。
  • 链式存储

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来存储该结点左孩子和右孩子所在结点的存储地址 。

    在这里插入图片描述

    四、二叉树的实现

    接下来我们用链表来实现二叉树的创建与遍历。

    二叉树定义

    typedef char BTDataType;
    typedef struct BinaryTreeNode
    {
    	BTDataType data;//数据
    	struct BinaryTreeNode* left;//左孩子结点
    	struct BinaryTreeNode* right;//右孩子结点
    }BTNode;
    

    1.创建二叉树

    在这里插入图片描述

    以上图为例建立一棵二叉树。
    以下代码并不是真正创建二叉树的方式,只是为了方便大家理解,所以手动快速创建一棵简单的二叉树。等后面学完二叉树遍历之后,我们再讲解二叉树的真正创建方式。

    //动态申请结点
    BTNode* BuyNode(BTDataType x)
    {
    	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
    	if (NULL == node)
    	{
    		perror("malloc");
    		return NULL;
    	}
    	node->data = x;
    	node->left = node->right = NULL;
    	return node;
    }
    //创建二叉树
    BTNode* CreatTree()
    {
    	BTNode* node1 = BuyNode('A');
    	BTNode* node2 = BuyNode('B');
    	BTNode* node3 = BuyNode('C');
    	BTNode* node4 = BuyNode('D');
    	BTNode* node5 = BuyNode('E');
    	BTNode* node6 = BuyNode('F');
    	node1->left = node2;
    	node1->right = node3;
    	node2->right = node4;
    	node3->left = node5;
    	node4->left = node6;
    	return node1;
    }
    

    2.二叉树的遍历

  • 前面我们讲过,二叉树分为:根、左子树、右子树。每个结点的左右子树又可以划分为这三个部分,直到最后一层的叶子结点,叶子结点是其本身的根结点,左右结点为空。根据这一特点,可以看出,二叉树定义是递归式的。
  • 二叉树遍历是按照某种特定的规则,依次访问每个节点,并且每个节点只访问一次。根据根节点的访问顺序分为三种遍历方式:前序遍历、中序遍历和后序遍历。
  • 在这里插入图片描述

    前序遍历

    前序遍历的访问顺序:根结点、左子树、右子树。
    其中,对于每棵子树,访问顺序也是根结点、左子树、右子树,一直递归到空结点。

    在这里插入图片描述

    在这里插入图片描述相同颜色框的是相同根节点的左右子树

    比如上图的前序遍历访问顺序为:A B NULL D F NULL NULL NULL C E NULL NULL NULL
    而我们一般不打印空结点,所以前序遍历结果为:A B D F C E

    //前序遍历
    void PreOrder(BTNode* root)
    {
    	if (NULL == root)
    	{
    		//printf("NULL ");
    		return;
    	}
    	printf("%c ", root->data);//打印根节点的值
    	PreOrder(root->left);//遍历子树
    	PreOrder(root->right);//遍历右子树
    }
    

    中序遍历

    中序遍历的访问顺序:左子树、根结点、右子树。
    还是拿上图示例,中序遍历访问顺序为:NULL B NULL F NULL D NULL A NULL E NULL C NULL
    去掉空结点后,中序遍历结果为:B F D A E C
    在这里插入图片描述

    在这里插入图片描述

    //中序遍历
    void InOrder(BTNode* root)
    {
    	if (NULL == root)
    	{
    		//printf("NULL ");
    		return;
    	}
    	InOrder(root->left);
    	printf("%c ", root->data);
    	InOrder(root->right);
    }
    

    后序遍历

    中序遍历的访问顺序:左子树、右子树、根结点。

    在这里插入图片描述

    在这里插入图片描述上图二叉树的后序遍历访问顺序为:NULL NULL NULL F NULL D B NULL NULL E NULL C A
    去掉空结点后,后序遍历结果为:F D B E C A

    //后序遍历
    void PostOrder(BTNode* root)
    {
    	if (NULL == root)
    	{
    		//printf("NULL ");
    		return;
    	}
    	PostOrder(root->left);
    	PostOrder(root->right);
    	printf("%c ", root->data);
    }
    

    层序遍历

    二叉树的层次遍历最好理解,从二叉树的根结点开始,从上到下每一层按照从左到右的顺序遍历。比如上图中二叉树的层序遍历为:A B C D E F

    前面三种遍历都是以递归的形式,而层序遍历可以用队列来实现非递归遍历。前面我们已经用C语言写过队列(点击跳转文章)结构,可以在vs中直接将队列的相关代码copy过来使用,在源文件和头文件中直接添加现有项即可。

    并将队列中的类型改为二叉树类型

    //typedef int QDataType;
    typedef struct BinaryTreeNode* QDataType;
    

    具体过程是:先将当前节点入队列,访问当前结点,再将当前结点出队列。然后将当前结点的左结点和右结点按顺序入队,如果为空结点则不用入队,直到队列为空。

    //层序遍历
    void LevelOrder(BTNode* root)
    {
    	assert(root);
    	Queue q;
    	QueueInit(&q);
    	QueuePush(&q, root);
    	while (!QueueEmpty(&q))
    	{
    		BTNode* front = QueueFront(&q);
    		QueuePop(&q);
    		printf("%c ", front->data);
    		if(front->left != NULL)
    			QueuePush(&q, front->left);
    		if (front->right != NULL)
    			QueuePush(&q, front->right);
    	}
    	QueueDestroy(&q);
    	printf("\n");
    }
    

    根据遍历顺序创建二叉树

    数组a存储前序遍历的顺序,比如通过前面我们知道二叉树的前序遍历结果为A B NULL D F NULL NULL NULL C E NULL NULL NULL ;我们将NULL替换成字符#表示空。数组下标用指针接收,否则递归函数中不会改变实参。

    //根据前序遍历的顺序二叉树创建
    BTNode* BTreeCreate_PreOrder(BTDataType* a, int* pi)
    {
    	// 通过前序遍历的数组"AB#DF###CE###"构建二叉树
    	if (a[*pi] == '#')
    	{
    		(*pi)++;//数组下标+1
    		return NULL;
    	}
    	BTNode* node = BuyNode(a[*pi]);//根据数组元素构建二叉树结点
    	(*pi)++;
    	node->left = BTreeCreate_PreOrder(a, pi);
    	node->right = BTreeCreate_PreOrder(a, pi);
    	return node;
    }
    

    根据中序/后序顺序来构建二叉树同理。

    int main()
    {
    	char a[] = "AB#DF###CE###";
    	int i = 0;
    	BTNode* root = BTreeCreate_PreOrder(a, &i);
    	//BTNode* root = BTreeCreate();
    	PreOrder(root);
    	printf("\n");
    	InOrder(root);
    	printf("\n");
    	PostOrder(root);
    	printf("\n");
    	return 0;
    }
    

    3.二叉树的基本操作

    在前面二叉树递归遍历的基础上,我们可以实现一些二叉树的基本操作。

    1.总结点个数

    转换成子问题:二叉树总结点个数=1(根节点个数)+ 左子树的结点个数 + 右子树的节点个数。很容易想到递归。

    //二叉树的总结点个数
    int BTreeSize(BTNode* root)
    {
    	if (NULL == root)
    	{
    		return 0;
    	}
    	return 1 + BTreeSize(root->left) + BTreeSize(root->right);
    }
    

    2.二叉树高度

    当前树的高度 = 左右子树中比较高的高度+1

    //二叉树的高度
    int BTreeLevel(BTNode* root)
    {
    	if (NULL == root)//空结点则返回0
    	{
    		return 0;
    	}
    	int leftLevel = BTreeLevel(root->left);//左子树的高度
    	int rightLevel = BTreeLevel(root->right);//右子树的高度
    	return leftLevel > rightLevel ? leftLevel + 1 : rightLevel + 1;
    }
    

    最好不要写成下面这样,会造成重复递归,判断时遍历左右子树递归两次,返回结果时又递归一次,栈帧开销会很大。

    return BTreeLevel(root->left) > BTreeLevel(root->right) ? 
    		BTreeLevel(root->left) + 1 : BTreeLevel(root->right) + 1;
    

    3.第K层结点个数

    求第K层结点个数,转换成子问题:求左子树第K-1层结点个数 + 右子树第K-1层结点个数

    //第k层结点的个数
    int BTreeLevelKSize(BTNode* root, int k)
    {
    	assert(k > 0);//默认根节点为第一层,所以不存在第0层
    	if (NULL == root)//空结点
    	{
    		return 0;
    	}
    	if (1 == k)//遍历到第k层
    	{
    		return 1;
    	}
    	return BTreeLevelKSize(root->left, k-1)+BTreeLevelKSize(root->right, k-1);
    }
    

    4.查找

    //查找值为x的结点
    BTNode* BTreeFind(BTNode* root, BTDataType x)
    {
    	if (NULL == root)
    		return NULL;
    	if (root->data == x)
    		return root;
    
    	BTNode* left = BTreeFind(root->left, x);
    	if (left)//左子树找到则返回
    		return left;
    	//左子树未找到,只可能存在于右子树
    	return BTreeFind(root->right, x);
    }
    

    5.判断二叉树是否是完全二叉树

    完全二叉树按层序走,非空结点一定是连续的。每次将当前结点的左右结点入队列,不用判空,空结点也入队列。遇到第一个空结点时,停止入队,开始判断队列中的元素是否都为空,若出现非空结点,说明不是完全二叉树,反之则是完全二叉树。

    //判断二叉树是否是完全二叉树
    bool BTreeComplete(BTNode* root)
    {
    	assert(root);
    	Queue q;
    	QueueInit(&q);
    	QueuePush(&q, root);
    	while (!QueueEmpty(&q))
    	{
    		BTNode* front = QueueFront(&q);
    		QueuePop(&q);
    		//完全二叉树按层序走,非空结点一定是连续的
    		if (NULL == front)//遍历到第一个空结点则退出循环,进入下个while循环判断
    		{
    			break;
    		}
    		else
    		{
    			//不为空则将左右孩子结点入队
    			QueuePush(&q, front->left);
    			QueuePush(&q, front->right);
    		}
    	}
    	//如果是完全二叉树,则队列中元素全是NULL
    	while (!QueueEmpty(&q))
    	{
    		BTNode* front = QueueFront(&q);
    		QueuePop(&q);
    		//有非空结点则说明非空结点不是完全连续,说明不是完全二叉树
    		if (front != NULL)
    		{
    			QueueDestroy(&q);//返回之前及时释放空间,防止内存泄露
    			return false;
    		}
    	}
    	QueueDestroy(&q);
    	return true;
    }
    

    4.销毁二叉树

    根节点最后释放,否则无法访问左右子树。

    //二叉树销毁(后序遍历)
    void BTreeDestroy(BTNode* root)
    {
    	if (NULL == root)
    		return;
    	BTreeDestroy(root->left);
    	BTreeDestroy(root->right);
    	free(root);
    	root = NULL;
    }
    

    完整代码:链式二叉树

二叉树基础知识总结 题外话昨晚面了腾讯,问了一个完全二叉树的题,竟然让我算了快10分钟,因为等比公式记错了导致最后用最原始的方法推算结果也没算对,一下子就懵了。本来精心准备了1周的面试,最后因为自己基础知识记忆不牢固导致了悲剧。不管怎样,还是要继续查漏补缺,准备将数据结构再细细看一遍,先来补上二叉树的这个漏洞吧。 一、树的定义树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。 树具有的... 阅读详情

相关推荐

数据结构之二叉树(Binary Tree)详解

二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,这些节点通过边连接起来。每个节点最多可以有两个子节点,分别称为左子节点和右子节点。 二叉树的特点包括: 每个节点最多有两个子节点。这两个子节点可以为空(null),也可以存在一个或两个子节点。 左子节点和右子节点的顺序是有意义的,即左子节点在右子节点之前或之后。 每个节点通常包含一个值(或称为关键字)以及其他辅助信息。

swadian2008的博客 2273

深入理解二叉树(超详细)

二叉树(Binary Tree) 回顾 在前面的文章 — 二叉树前奏中,我们对于二叉树的一些基本概念进行了回顾,同时对比了线性结构与树形结构,总结了一些常见的二叉树的性质,像二叉树,真二叉树,完全二叉树,以及满二叉树等等,但是,我们仅仅是在概念上对于二叉树有所了解,并没有进行编码工作,今天来完善一下这一步的操作 直接进入二叉树的设计与编码,如果你对于二叉树的概念以及性质不了解的话,可以回去翻翻 二叉树前奏,熟悉一下,因为编码实际上就是对于二叉树性质的一个体现 设计 属性与节点 首先,我们的二叉树是用来存放元

Kalton的博客 2万+

数据结构-二叉树(binary tree)-二叉查找树(binary search tree)

二叉树(binary)二叉树就是节点的度不大于2的树,即树中每个节点的子节点最多只有两个。每个节点的子节点分为左子节点和右子节点,并且左右子节点的顺序不能改变。1. 二叉树分类二叉树分为满二叉树、完全二叉树和完美二叉树。

蜗牛君的奋斗史 2585

【数据结构】——二叉树详解

二叉树(Binary Tree)是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树TTT有且仅有一个根结点;除根结点外的其余结点又可分为两个不相交的子集TLT_LTL​和TRT_RTR​,分别称为TTT的左子树和右子树,且TLT_LTL​和TRT_RTR​本身又都是二叉树。很明显该定义属于递归定义,所以有关二叉树的操作使用递归往往更容易理解和实现。从定义也可以看出二叉树与一般树的区别主要是两点,一是每个结点的度最多为2;

atwdy的博客 6万+

数据结构 五:二叉树(Binary Tree)

一、概念 二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者空集(空二叉树),或由一个结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。 图5.1 二、二叉树的特点 1、每个结点最多两棵树,所以二叉树的结点的度最大为2; 2、左子树和右子树是有序的; 3、即使树中某结点只有一棵树,也要区分它是左子树还是由子树。 图5.

李晓东的博客 1310

深入解析ISO12233标准:SFR算法从理论到代码实现

本文深入解析ISO12233标准中的SFR算法,从理论到代码实现全面介绍如何量化成像系统的解析力。通过e-SFR算法测量边缘扩散函数(ESF)和空间频率响应(SFR),结合光学原理和实际代码示例,帮助开发者准确评估影像质量。文章包含关键步骤的Python实现和工程优化技巧,适用于相机测试、镜头评估等应用场景。

weixin_29200485的博客 156

数据结构——二叉树(Binary Tree)

本文介绍了二叉树及其重要变体有序二叉树(BST)

2302_79781252的博客 1338

E-Prime脑电实验打mark全攻略:从端口查询到串并口实战(附常见问题解决)

本文提供了E-Prime脑电实验打mark的完整实战指南,涵盖端口查询、并口与串口配置的核心步骤及常见问题解决。文章深入解析了mark原理,并详细介绍了通过E-Basic脚本和Serial设备对象发送信号的两种方法,帮助研究者实现E-Prime与脑电设备的高精度时间同步,确保实验数据可靠性。

4k5l6j7h8的博客 355

【数据结构】二叉树(binary tree)

摘要:本文系统介绍了二叉树的基本概念、特性和实现方法。阐述了二叉树的定义,性质实现及其证明,然后讲解了三种特殊二叉树的结构特征。此外,详细说明了前序、中序、后序和层序四种遍历算法实现。提供了二叉树创建与销毁的实现。同时还介绍了结点、叶子结点个数、第k层结点的计数,查找值为x的结点等基本操作的递归算法。全文通过图文并茂的方式,全面展示了二叉树这一重要数据结构的关键知识点。

qjx的博客 2859

通达信大单资金实时监控与播报插件:股票分析的实用利器——大红球

本文介绍了一款专为通达信软件设计的大单资金实时监控与播报插件,该插件以其傻瓜式操作和入门级特性在股民中广受欢迎。插件核心功能包括与通达信版面的无缝联动、大单金额范围的自定义设置、资金流动的可视化展示以及智能声音播报等。其技术架构基于本地网页形式,自带分时图显示功能,数据实时更新且无需L2账户,承诺永久免费升级。插件通过红绿球的大小和颜色直观展示资金规模与买卖方向,顶端全局统计功能提供宏观资金流动分析。尽管插件数据具有较高参考价值,但投资者仍需结合其他因素进行综合判断。插件界面可自适应调整,提供个性化使用体验

guleba的博客 6597

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 390

【数据结构】剖析二叉树(Binary Tree)

二叉树是每个节点最多有两个子树的树结构。它具有递归的性质,节点分为根节点、左子节点和右子节点。二叉树有多种类型,如完全二叉树、满二叉树等。在算法和数据结构领域,二叉树常用于搜索、排序、存储和遍历等操作。

A Charmer 的博客 1893

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9198

Java 【数据结构】 二叉树(Binary_Tree)【神装】

首先,我意识到了数据结构在编程中的关键性,二叉树作为其中的重要一环,对算法设计和问题解决都有着深远的影响。深入理解二叉树的基本概念,如节点、根节点、子节点等,为我理解二叉树结构和算法打下了坚实的基础。掌握了常见的操作和遍历算法,如插入节点、删除节点以及深度优先遍历和广度优先遍历,这些都是对树形结构理解和应用至关重要的。

2302_79806056的博客 2339

国密SSL通信的调试技巧

前面写了几篇国密开发相关的文章:解读国密非对称加密算法SM2啥?双证书?详解国密SM2的加密和解密详解国密SSL ECC_SM4_SM3套件详解国密SM2的数字签名这篇文章来聊一聊国密S...

云水木石 3206

基于多智能体的自动化公司调研系统

在当今竞争激烈的商业世界中,了解公司的详细信息对于投资者、合作伙伴和研究机构等具有重要意义。传统的公司调研方式往往需要耗费大量的人力、物力和时间,且容易出现信息不全面、不准确等问题。基于多智能体的自动化公司调研系统的目的是利用多智能体技术,实现公司调研的自动化和智能化,提高调研的效率和准确性。本系统的范围涵盖了公司基本信息收集、市场竞争力分析、财务状况评估等多个方面。本文将按照以下结构进行组织:首先介绍系统的核心概念和相关联系,包括多智能体系统的原理和架构;

架构师的AI之路,分享AI应用开发架构的学习与实践。 966

【数据结构】二叉树 (Binary Tree)

二叉树快速入门

Living_Amethyst的博客 2683

【软考高项论文】论信息系统项目管理的干系人绩效域

例如,在处理与电信运营商合作铺设光纤网络的问题时,考虑到其在通信设施建设和运维方面的专业性和重要性,我们将之定位为高权力高利益的干系人,给予了高度关注和优先沟通。项目全程,我们对干系人绩效域的执行效果进行了定期检查和评估,通过定量与定性的数据收集,确认了项目在干系人管理上的成效,具体表现为:建立了稳固的工作关系网络,使干系人普遍认可项目目标;鉴于本项目牵涉到政府各级部门、企事业单位、市民团体、技术研发伙伴等多种类型的干系人,且干系人的诉求和影响力各异,因此,有序且持续的干系人参与管理显得尤为关键。

Programming Talk 1683

数据结构——二叉树(binary tree)

介绍树的基本概念和二叉树

Jacks丶的博客 1020

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构--二叉树 Binary Tree

文章目录1.概念2.存储方式2.1 链式存储(二叉树代码大部分是链式实现的)2.2 顺序存储(基于数组)3.二叉树的遍历 1.概念 二叉树,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点 满二又树,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点。 完全二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左排...

Michael是个半路程序员 1486

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构:线索二叉树(Threaded Binary Tree)

我们知道满二叉树只是一种特殊的二叉树,大部分二叉树的结点都是不完全存在左右孩子的,即很多指针域没有被充分地利用。另一方面我们在对一棵二叉树做某种次序遍历的时候,得到一串字符序列,遍历过后,我们可以知道结点之间的前驱后继关系,也就是说,我们可以很清楚地知道任意一个结点,它的前驱和后继是哪一个。可是这是建立在已经遍历过的基础之上的。在二叉链表上,我们只能知道每个结点指向其左右孩子结点的地址,而不知道某

Meditation 3960

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【数据结构入门】树、二叉树(Binary tree)

文章目录一、树的概念和结构1.1 树的概念1.2 树的结构 & 相关名词解释1.3 树的表示1.4 树的应用二、二叉树的概念 & 存储结构(重要)2.1 二叉树的概念2.2 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 一、树的概念和结构 1.1 树的概念 树是一种非线性的数据结构,它是由 n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,称为根结点,根节点没有前驱结点 除根节点

codewinter的博客 1133

【数据结构与算法】二叉树(Binary Tree)

C语言实现二叉树 binary tree 二叉树前序遍历(二叉树的深度优先遍历) 二叉树中序遍历 二叉树后续遍历 二叉树前序中序后续遍历 二叉树层序遍历(二叉树的广度优先遍历) 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 判断二叉树是否是完全二叉树 求二叉树节点个数 求二叉树叶子结点个数 求二叉树的高度/求二叉树的深度 求二叉树第k层的节点个数 完全二叉树/满二叉树/堆heap 二叉搜索树二叉查找树二叉排序树 平衡二叉树avl树 B树 红黑树

m0_52602233的博客 1034

数据结构:满二叉树 (Full Binary Tree) 和 完全二叉树 (Complete Binary Tree)

本文深入解析了三种重要的二叉树类型:严格二叉树、完美二叉树和完全二叉树。严格二叉树要求每个节点度为0或2;完美二叉树(国内称"满二叉树")是严格二叉树的特例,所有叶子在同层;完全二叉树则要求节点按层序连续排列,是数组表示法的理想结构。三者关系可概括为:完美二叉树同时属于严格二叉树和完全二叉树,而后两者从不同维度(节点度vs排列位置)定义树结构,存在交集但不互相包含。理解这些概念的差异与联系是掌握二叉树特性的关键。

2402_88047672的博客 1548

数据结构:二叉树(Binary tree)

本文介绍了二叉树的基本概念和实现方法。主要内容包括:1.树的相关概念,如节点、度、层等术语;2.二叉树的定义、特性(如满二叉树、完全二叉树)和遍历方式(前序、中序、后序、层序遍历);3.二叉树的两种存储方式(顺序存储和链式存储)及其适用场景;4.代码实现示例,包括递归实现完全二叉树和非完全二叉树的创建、遍历和销毁操作。文章强调二叉树在高效查找、排序等方面的重要应用价值。

2301_81830380的博客 446
上一篇: 【数据结构】栈(Stack)和队列(Queue)
下一篇: 【数据结构】堆(Heap)
炸掉地球
博客等级 码龄5年 1028粉丝 31原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值