树与二叉树

这篇具有很好参考价值的文章主要介绍了树与二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

树与二叉树



一、树的概念及结构

1.、树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

  • 有一个特殊的结点,称为根结点,根节点没有前驱结点 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。

  • 每棵子树的根结点有且只有一个前驱,可以有0个或多个后继,因此树是递归定义的。

​​树与二叉树,数据结构​​树与二叉树,数据结构

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

2、树的相关概念

树与二叉树,数据结构

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

叶节点或终端节点:度为0的节点称为叶节点(也就是没有子树的节点);如上图:B、C、H、I、K、L、M、N都是叶子节点

非终端节点或分支节点:度不为0的节点;如上图:D、E、J等节点都是非终端节点

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

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

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

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6 (A的节点的度最大为6)

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

树的高度或深度:树中节点的最大层次; 如上图:树的高度为4 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点

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

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

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

上述概念不用特别记忆,根据图片进行理解即可

文章来源地址https://www.toymoban.com/news/detail-829168.html

1.3 树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法 等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

理解起来就是一个节点的左边是它的孩子,右边是它的兄弟(左孩子右兄弟表示)

如下左边为原树,右边为孩子兄弟表示法后的示意图

​​树与二叉树,数据结构​​树与二叉树,数据结构​​​​

二、二叉树

1.概念

一棵二叉树是结点的一个有限集合,该集合: 1. 或者为空 2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

特点:

  1. 二叉树不存在度大于2的结点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2、特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^K - 1 ,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

3、二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点

  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2^k - 1.

  3. 对任何一棵二叉树, 如果度为0其叶结点个数为x0 , 度为2的分支结点个数为x2 ,则有 x0= x2+1

  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log(n+1)(注:是log以2为底,n+1为对数)

  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对 于序号为i的结点有:

    1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

    2. 若2i+1=n否则无左孩子

    3. 若2i+2=n否则无右孩子

注:二叉树的性质是许多选择题考察的重点与仔细记忆

有下面的例题可以供大家练习

某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )

A 不存在这样的二叉树

B 200

C 198

D 199

2.下列数据结构中,不适合采用顺序存储结构的是( )

A 非完全二叉树

B 堆

C 队列

D 栈

3.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )

A n

B n+1

C n-1

D n/2

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )

A 11

B 10

C 8

D 12

5.一个具有767个节点的完全二叉树,其叶子节点个数为()

A 383

B 384

C 385

D 386

答案: 1.B 2.A 3.A 4.B 5.B

4、二叉树的存储结构

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

  1. 顺序存储

    顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

    1. 完全二叉树的顺序存储

      树与二叉树,数据结构

    2. 非完全二叉树的顺序存储

      树与二叉树,数据结构

  2. 链式存储

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。

    示意:

    树与二叉树,数据结构

    typedef int BinaryNode;
    
    typedef struct BinaryTreeNode {
    	struct BinaryTreeNode* left;//指向左孩子
    	struct BinaryTreeNode* right;//指向右孩子
    	BinaryNode val;//当前区域的数据存放区域
    };
    

三、二叉树的顺序结构及实现

1、二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。

而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

树与二叉树,数据结构树与二叉树,数据结构​​

2、堆的概念及结构

如果有一个关键码的集合K = { k0,k1,k2,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: ki<k2i+1= 且 ki<=k2i+2 ( ki>=k2i+1 且 ki>=k2i+2 ) i = 0,1, 2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 堆的性质: 堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。

堆的性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;

  • 堆总是一棵完全二叉树。

  1. 小堆示意

    树与二叉树,数据结构

  2. 大堆示意

    树与二叉树,数据结构

  3. 题目测试

    1.下列关键字序列为堆的是:()

    A 100,60,70,50,32,65

    B 60,70,65,50,32,100

    C 65,100,70,32,50,60

    D 70,65,100,32,50,60

    E 32,50,100,70,65,60

    F 50,100,70,65,60,32

    2.已知小根堆为8,15,10,21,34,16,12,删除关键字8之后需重建堆,在此过程中,关键字之间的比较次数是()。

    A 1 B 2 C 3 D 4

    3.一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为

    A(11 5 7 2 3 17)

    B(11 5 7 2 17 3)

    C(17 11 7 2 3 5)

    D(17 11 7 5 3 2)

    E(17 7 11 3 5 2)

    F(17 7 11 3 2 5)

    4.最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()

    A[3,2,5,7,4,6,8]

    B[2,3,5,7,4,6,8]

    C[2,3,4,5,7,8,6]

    D[2,3,4,5,6,7,8]

    答案

    1.A 2.C 3.C 4.C

3、堆的实现

  1. 堆向下调整算法

    现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整 成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

    图片示意:

    树与二叉树,数据结构注:在建立小堆的向下调整中,是在孩子中选取比当前节点小的节点,如果两个孩子节点都比当前节点小,则选择更小的那一个节点进行交换

  2. 堆的创建

    下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算 法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的 子树开始调整,一直调整到根节点的树,就可以调整成堆。

    图示:

    树与二叉树,数据结构

  3. 具体实现:

    结构:

    typedef int HPDataType;
    
    typedef struct Heap {
    	HPDataType* a;
    	int size;
    	int capacity;
    }Heap;
    

    功能:

    // 堆的初始化
    void HeapInit(Heap* hp) {
    	assert(hp);
    	hp->a = (HPDataType*)malloc(sizeof(HPDataType) * 4);
    	if (hp->a == NULL) {
    		perror("malloc");
    	}
    	hp->capacity = 4;
    	hp->size = 0;
    }
    
    void Swap(HPDataType* a1,HPDataType* a2) {
    	HPDataType temp = *a1;
    	*a1 = *a2;
    	*a2 = temp;
    }
    
    //向上调整(升序)
    void SortUp(HPDataType* a,int child) {
    
    	int parent = (child-1) / 2;
    
    	while (child > 0) {
    		if (a[child] < a[parent]) {
    			Swap(&a[child], &a[parent]);
    			child = parent;
    			parent = (parent - 1) / 2;
    		}
    		else {
    			break;
    		}
    	}
    }
    
    //向下调整(小堆)
    void SortDown( HPDataType* a, int size,int parent) {
    	int child = parent * 2 + 1;
    
    	while (child < size) {
    		//判断那一个孩子更小
    		if (child + 1 < size && a[child] < a[child + 1] ) {
    			child++;
    		}//与小的孩子交换,并更新父亲与孩子节点的下标
    		if (a[child] < a[parent]) {
    			Swap(&a[child], &a[parent]);
    			parent = child;
    			child = parent * 2 + 1;
    		}//没有更小的了,向下调整结束
    		else {
    			break;
    		}
    	}
    }
    
    // 堆的销毁
    void HeapDestory(Heap* hp) {
    	assert(hp);
    
    	free(hp);
    	hp = NULL;
    	hp->capacity = hp->size = 0;
    }
    
    // 堆的插入
    void HeapPush(Heap* hp, HPDataType x) {
    	assert(hp);
    
    	//判满
    	if (hp->size == hp->capacity) {
    		int newCapacity = hp->capacity == 0 ? 4 : hp->capacity * 2;
    		HPDataType* tmp = (HPDataType*)realloc(hp->a, newCapacity * sizeof(HPDataType));
    		if (tmp == NULL) {
    			perror("malloc");
    		}
    		hp->a = tmp;
    		hp->capacity = newCapacity;
    	}
    
    	hp->a[hp->size] = x;
    	hp->size++;
    
    	SortUp(hp->a,hp->size-1);
    }
    
    
    // 堆的删除
    void HeapPop(Heap* hp) {
    	assert(hp);
    	assert(hp->size > 0);
    
    	Swap(&hp->a[0], &hp->a[hp->size - 1]);
    	hp->size--;
    
    	SortDown(hp->a, hp->size, 0);
    
    
    }
    
    // 取堆顶的数据
    HPDataType HeapTop(Heap* hp) {
    	assert(hp);
    	assert(hp->size > 0);
    
    	return hp->a[0];
    }
    
    // 堆的数据个数
    int HeapSize(Heap* hp) {
    	assert(hp);
    
    	return hp->size;
    }
    
    // 堆的判空
    bool HeapEmpty(Heap* hp) {
    	assert(hp);
    
    	return hp->size == 0;
    }
    
    //打印
    void HeapPrint(Heap* hp) {
    	for (int i = 0; i < hp->size;i++) {
    		printf("%d ",hp->a[i]);
    	}
    	printf("\n");
    }
    

四、二叉树链式结构的实现

1、遍历

学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉 树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历 是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。 按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

  1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。 访问顺序:根、左子树、右子树
  2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。访问顺序:左子树、根、右子树
  3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。 左子树、右子树、根

图示:

树与二叉树,数据结构

2、代码实现

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef char BTDataType;

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

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi);
// 二叉树销毁
void BinaryTreeDestory(BTNode* root);
// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
//二叉树高度
int BinaryTreeHeight(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root);
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root);
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root);
//层序遍历
void BinaryTreeLevelOrder(BTNode* root);

#include"BinaryTree.h"

//通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi) {
	if (a[*pi] == '#') {
		(*pi)++;
		return NULL;
	}

	BTNode* root = (BTNode*)malloc(sizeof(BTNode));
	if (root == NULL) {
		perror("malloc error");
		return;
	}

	root->data = a[(*pi)++];

	root->left = BinaryTreeCreate(a, pi);
	root->right = BinaryTreeCreate(a, pi);

	return root;
}
// 二叉树销毁
void BinaryTreeDestory(BTNode* root)
{
	if (root <span style="font-weight: bold;" class="mark"> NULL)
		return;

	BinaryTreeDestory(root->left);
	BinaryTreeDestory(root->right);
	free(root);
}


// 二叉树节点个数
int BinaryTreeSize(BTNode* root) {
	return root </span> NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

int BinaryTreeHeight(BTNode* root) {
	if (root == NULL) {
		return 0;
	}

	int leftHeight = BinaryTreeHeight(root->left);
	int rightHeight = BinaryTreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;

}

// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root) {
	//为空的节点
	if (root <span style="font-weight: bold;" class="mark"> NULL) {
		return 0;
	}
	//叶子节点
	if (root->left </span> NULL && root->right <span style="font-weight: bold;" class="mark"> NULL) {
		return 1;
	}
	//总节点数
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k) {
	assert(k > 0);
	if (root </span> NULL) {
		return 0;
	}
	else if (k <span style="font-weight: bold;" class="mark"> 1) {
		return 1;
	}
	return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x) {
	if (root </span> NULL) {
		return NULL;
	}
	else if (root->data == x) {
		return root;
	}
	BTNode* ret;

	ret = BinaryTreeFind(root->left, x);
	if (ret != NULL) {
		return ret;
	}

	ret = BinaryTreeFind(root->right, x);
	if (ret != NULL) {
		return ret;
	}

	return NULL;
}
// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root) {
	if (root <span style="font-weight: bold;" class="mark"> NULL) {
		printf("N ");
		return;
	}

	printf("%c ", root->data);
	BinaryTreePrevOrder(root->left);
	BinaryTreePrevOrder(root->right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root) {
	if (root </span> NULL) {
		printf("N ");
		return;
	}

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

	BinaryTreePostOrder(root->left);
	BinaryTreePostOrder(root->right);
	printf("%c ", root->data);
}

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root) {
	Queue a;
	QueueInit(&a);

	if (root) {
		QueuePush(&a, root);
	}

	int levelSize = 1;
	while(!QueueEmpty(&a)){

		/*BTNode* font = QueueFront(&a);
		QueuePop(&a);
		printf("%c ", font->data);

		if (font->left ) {
			QueuePush(&a, font->left);

		}
		if (font->right) {
			QueuePush(&a,font->right);
		}*/


		while (levelSize--) {
			BTNode* font = QueueFront(&a);
			QueuePop(&a);
			printf("%c ", font->data);

			if (font->left) {
				QueuePush(&a, font->left);

			}
			if (font->right) {
				QueuePush(&a, font->right);
			}
		}
		printf("\n");
		levelSize = QueueSize(&a);
	}
	printf("\n");

	QueueDestroy(&a);
}

到了这里,关于树与二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构_树与二叉树

    目录 1. 树的基本概念 1.1 树的定义 1.2 基本术语 1.3 树的性质 1.4 相关练习 2. 二叉树的概念 2.1 二叉树的概念及其主要特性 2.2 二叉树的存储结构 2.2.1 顺序存储结构 2.2.2 链式存储结构 2.3 相关练习 3. 二叉树的遍历和线索二叉树 3.1 二叉树的遍历 3.1.1 先序遍历 3.1.2 中序遍历 3.1

    2024年02月04日
    浏览(46)
  • 【数据结构与算法】树与二叉树

    除了之前我们讲的栈、队列、链表等线性结构,数据结构中还有着一对多的 非线性结构 ——— 树 。 树是有 n 个结点组成的有限集,当n=0时为空树,在任意一颗非空树中,有且仅有一个 特定的根结点 ;当n1时,其余结点又可以分为一棵树,称为根的 子树 。 如下图所示: A为

    2023年04月09日
    浏览(50)
  • 数据结构与算法——树与二叉树

    😊各位小伙伴久等了,本专栏新文章出炉了!!! 我又回来啦,接下来的时间里,我会持续把数据结构与算法专栏更新完。 👉树型结构👈 是一类重要的 ✍非线性数据结构 ,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的层次结构。树型结构在客观世界中

    2024年02月11日
    浏览(46)
  • 【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)

      二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是 空集 ,被称为 空二叉树 ,要么由一个根结点和两棵不相交的子树组成,分别称为 左子树 和 右子树 。每个结点最多有两个子结点,分别称为左子结点和右子结点。 引理5.1:二叉树中层数

    2024年02月01日
    浏览(40)
  • 【数据结构】24王道考研笔记——树与二叉树

    树是n个结点的有限集合,n=0时,称为空树。非空树满足: 除了根节点外,任何一个结点都有且仅有一个前驱 结点的层次(深度):从上往下数 结点的高度:从下往上数 树的高度(深度):总共有多少层 结点的度:有几个孩子(分支) 树的度:各节点的度的最大值 森林:

    2024年02月13日
    浏览(50)
  • 数据结构与算法——树与二叉树篇详解

    树形结构是一种非常重要的 非线性结构 ,树形结构中数据元素之间具有 一对多 的逻辑关系。 1.1.1 树的定义 树是由n(n=0)个结点所构成的有限集合 当n=0时,称为空树 当n0时,n个结点满足以下条件 有且仅有一个称为根的结点 其余结点可分为m个互不相交的有限集合,且每一个

    2024年02月06日
    浏览(50)
  • 数据结构之树与二叉树——算法与数据结构入门笔记(五)

    本文是算法与数据结构的学习笔记第五篇,将持续更新,欢迎小伙伴们阅读学习。有不懂的或错误的地方,欢迎交流 前面章节介绍的都是线性存储的数据结构,包括数组、链表、栈、队列。本节带大家学习一种非线性存储的数据结构,即树(tree)。 不管是在面试时,还是日

    2024年02月08日
    浏览(50)
  • 数据结构--》解锁数据结构中树与二叉树的奥秘(一)

            数据结构中的树与二叉树,是在建立非线性数据结构方面极为重要的两个概念。它们不仅能够模拟出生活中各种实际问题的复杂关系,还常被用于实现搜索、排序、查找等算法,甚至成为一些大型软件和系统中的基础设施。         无论你是初学者还是进阶者

    2024年02月08日
    浏览(46)
  • 数据结构--》解锁数据结构中树与二叉树的奥秘(二)

            数据结构中的树与二叉树,是在建立非线性数据结构方面极为重要的两个概念。它们不仅能够模拟出生活中各种实际问题的复杂关系,还常被用于实现搜索、排序、查找等算法,甚至成为一些大型软件和系统中的基础设施。         无论你是初学者还是进阶者,

    2024年02月08日
    浏览(43)
  • 【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

    树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方法) 二叉树遍历算法的应用: 【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、

    2024年04月13日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包