C语言二叉树和堆

news2024/10/7 6:48:49

二叉树基础知识:

1.栈、队列和顺序表都是线性结构

但是二叉树不是,二叉树是多分支结构

2.任何一棵树都可以拆分为子树和根节点,许多二叉树的相关问题都是用分治的思想进行函数的递归进行解决。

例:前序,中序,后序遍历二叉树

前序遍历:

void print_Front(pNode a)
{
	if (a == NULL)
	{
		printf("N ");
		return;
	}

	printf("%d ", a->val);
	print_Front(a->LeftChild);
	print_Front(a->RightChild);
}

3.二叉树链表实现可以用左孩子、右兄弟的方法来找到各个节点

struct TreeNode
{
	int data;
	struct TreeNode* leftchild;
	struct TreeNode* rightbrother;
};

图:

如上图,就可以找到二叉树中的所有节点。但缺点是:空间存在不小的浪费

4.也可以用双亲表示法来用数组造二叉树(但是:该方法只适合满二叉树和完全二叉树):

即:每个元素都存储好自己的父亲的下标位置,没有父亲的存-1

下标位置规律:

左孩子下标 = 父下标 * 2 + 1

右孩子下标 = 父下标 * 2 + 2

父下标 = (孩子下标 - 1 ) / 2 

例:

注:物理结构是数组(实际上的)

逻辑结构是二叉树(想象中的)

4.5.搜索二叉树特点:

左节点数据 < 根数据 < 右节点数据

5.堆:

堆分为大堆和小堆,但他们都是完全二叉树

大堆:父节点都大于子节点

小堆:父节点都小于子节点

6.完全二叉树要用数组去存储,但非完全二叉树要用链式结构去存储

可以用二叉链和三叉链存储

二叉链:

三叉链:

做题时要具备的良好素养:

1.一个节点含有的子树的个数就是该节点的度

2.一棵具有n个节点n-1条边

3.子树不能相交,即树不能有环

4.度为二的节点的个数始终等于度为零的节点个数 - 1

即:n0 = n2 + 1

5.二叉树可以是空树

6.完全二叉树的节点N和高度h的关系:

完全二叉树为满二叉树的情况:

N = 2 ^ h - 1

h = log(N + 1)

完全二叉树最后一层只有一个节点的情况:

N = 2 ^ (h - 1)

h = logN + 1

建议先记N = f(h),指数形式的这个好记

7.堆插入数据:用的是向上调整算法,时间复杂度:O(logN)

插入数据:
直接在数组尾部插入数据,然后向上调整

堆删除数据:用的是向下调整算法,时间复杂度:O(logN)

删除操作:
将顶部数据和数组最后一个元素换位,然后数组元素总数--,再让顶部数据向下调整

8.想要用向上调整建堆或向下调整建堆,就必须先确保根节点的左子树和右子树都统一是大堆或小堆,然后才能用此方法

9.用堆排序来排列一个升序数组:

用到了向下调整算法,向下调整建堆

typedef int tree_data_type;

void Swap(int* p1, int* p2)
{
	int tem = *p1;
	*p1 = *p2;
	*p2 = tem;
}

void Downsort_alg(int *a, int father, int n)
{
	int flag = 1;
	while (flag == 1)
	{
		flag = 0;
		if (father * 2 + 1 >= n)
		{
			break;
		}
		tree_data_type tem = father * 2 + 1;
		if (father * 2 + 2 < n && a[father * 2 + 1] < a[father * 2 + 2])
		{
			tem = father * 2 + 2;
		}
		if (a[tem] > a[father])
		{
			Swap(&a[tem], &a[father]);
			flag = 1;
			father = tem;
		}
	}
}

void Heapsort(int* a, int n)
{
	assert(a);
	assert(n > 0);

	int i = (n - 1 - 1) / 2;
	for (; i >= 0; i--)
	{
		Downsort_alg(a, i, n);
	}
}

void Heap_sort_order(int* a, int n)
{
	assert(a);
	assert(n > 0);
	Heapsort(a, n);

	int i = 0;
	while(n > 0)
	{	
		Swap(&a[0], &a[n - 1]);
		--n;
		Downsort_alg(a, 0, n);
	}
}

10.想要在n个数据中选出前k大的数据:

一个可以容纳k个元素的小堆

遍历n个数据,只要某个数据比顶点数据大,就将二者置换,接着向下调整算法

完事后,堆里边的就是前k大的数据

时间复杂度:k + (N - k) * logk

这是N远大于k的情况下

例:

在n个数据里边找前k小的数据

void create()
{
	srand((unsigned int)time(NULL));
	FILE* pf = fopen("test.txt", "w");

	int i = 0;
	for (i = 0; i < 10000; i++)
	{
		int tem = rand() * 100 + rand() * 10 + rand();
		fprintf(pf, "%d\n", tem);
	}
	fclose(pf);
	pf = NULL;
}

#define k 5
void Top(int n)
{
	FILE* pf = fopen("test.txt", "r");
	int a[k];
	int i = 0;
	for (; i < k; i++)
	{
		fscanf(pf, "%d", &a[i]);
	}
	Heapsort(a, k);//建的是大堆
	//找前k小的值
	for (; i < n; i++)
	{
		int tem;
		fscanf(pf, "%d", &tem);
		if (tem < a[0])
		{
			int tem1 = tem;
			tem = a[0];
			a[0] = tem1;
			Heapsort(a, k);
		}
	}
	print(a, k);
	fclose(pf);
	pf = NULL;
}

11.二叉树的层序遍历:

新造数组来完成,出一个进一个,没孩子不进或进NULL

例:

造数组出来的过程就是

12.OJ题目当中的二叉树数组表示时,都是用的层序

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1639991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

【牛客网】排列计算

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 如果直接涂色来计算单点权重&#xff0c;2e5*2e5必然超时。 所以用差分进行优化。 3. 代码实现 #include<bits/stdc.h> using name…

漏洞扫描神器:Nessus 保姆级教程(附破解步骤)

一、介绍 Nessus是一款广泛使用的网络漏洞扫描工具&#xff0c;用于发现和评估计算机系统和网络中的安全漏洞。它是一款功能强大的商业工具&#xff0c;由Tenable Network Security开发和维护。 以下是Nessus的一些主要特点和功能&#xff1a; 1. 漏洞扫描&#xff1a;Nessu…

来一篇错题集(虽然简单吧)

一.Assembly via Remainders #include<bits/stdc.h> using namespace std; typedef long long ll; int a[2000]; int b[2000]; int main(){int t;cin>>t;while(t--){int n;cin>>n;for(int i1;i<n-1;i){cin>>b[i];}int x1000000000;//使用1000000000…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

uniapp实现点击事件跳转页面

首先定义一个点击事件 这里采用的vue3的写法&#xff0c;然后写上触发事件后要跳转的路径 function jump() {uni.switchTab({url:/pages/bangong/index})} 到这里就简单的实现uniapp的点击跳转页面了

类和对象【四】运算符重载

文章目录 运算符重载的概念运算符重载&#xff08;函数&#xff09;返回值类型&#xff1a;任意类型函数名&#xff1a;operator已有操作符 运算符重载&#xff08;函数&#xff09;的特点和注意点3个比较特殊的运算符重载赋值运算符&#xff08;&#xff09;重载返回值类型和返…

C++奇迹之旅:C++内存管理的机制(进阶篇)

文章目录 &#x1f4dd;new和delete操作自定义类型&#x1f320; operator new与operator delete函数&#x1f309;operator new与operator delete函数 &#x1f320;new和delete的实现原理&#x1f309;内置类型&#x1f309;自定义类型 &#x1f320;定位new表达式(placement…

【CTF MISC】XCTF GFSJ0512 give_you_flag Writeup(图像处理+QR Code识别)

give_you_flag 菜狗找到了文件中的彩蛋很开心&#xff0c;给菜猫发了个表情包 解法 图片的最后一帧好像闪过了什么东西。 用 Photoshop 打开&#xff0c;检查时间轴。 找到一张二维码&#xff0c;但是缺了三个角&#xff08;定位图案&#xff09;&#xff0c;无法识别。 找一…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…

学习经验分享【34】目标检测算法常见疑问(持续更新)

很多同学在学习深度学习算法过程中会遇到各种各样的问题,本博文对大家普遍存在的问题进行答疑,包括写论文常需要的指标FPS如何计算得到,怎么判断模型是否收敛等问题。如有问题可通过以下方式联系我。 一、Fuse指的是什么 Fuse是指模型的一些模块进行融合,最常见的就是conv和…

AI图书推荐:如何使用ChatGPT来提升逻辑分析能力

在一个日益由数据和技术驱动的世界中&#xff0c;进行逻辑思考和做出明智决策的能力比以往任何时候都更为关键。逻辑分析构成了理性思考的基础&#xff0c;引导我们穿越复杂问题&#xff0c;并帮助我们得出合理的结论。随着人工智能&#xff08;AI&#xff09;的出现&#xff0…

普通电机与变频电机区别

普通电机和变频电机之间的区别&#xff1a; 1. 设计和构造&#xff1a; - 普通电机&#xff1a;设计用于在恒定的电源频率和电压下工作&#xff0c;通常具有固定的转速和功率。 - 变频电机&#xff1a;专门设计用于与变频器配合使用&#xff0c;能够在变化的频率和电压下运行&…

07 - 步骤 javaScript代码

简介 JavaScript 代码是通过 JavaScript 脚本步骤来执行 JavaScript 脚本的一种方式。这允许用户在 Kettle 的数据流程中使用 JavaScript 编写自定义的脚本逻辑&#xff0c;用于数据处理、转换、计算等操作。 使用 场景 我需要在数据流加一个字段 createTime 当前时间&…

2024年 Java 面试八股文——SpringMVC篇

目录 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常用注解 6.SpringMVC和struts2的区别 7.怎么实现SpringMVC拦截器 8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&am…

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

C++ 多态(一)

一、多态定义 同一种操作作用于不同的对象时&#xff0c;可以产生不同的行为。在面向对象编程中&#xff0c;多态性是指通过继承和重写实现的&#xff0c;同一个方法在不同的子类中可以表现出不同的行为。多态性可以提高代码的灵活性和可扩展性&#xff0c;使得程序更易于维护…

LeetCode 131 —— 分割回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;按照 LeetCode 5——最长回文子串 中的思路&#xff0c;我们先求出 d p dp dp&#xff0c;这样我们就知道了所有的子串是否是回文子串。 然后&#xff0c;我们进行一个 dfs 搜索&#xff0c;起…

汇报进度26届cpp,目前来说之后的规划,暑假打算回家10天就留校沉淀了

汇报一下进度吧&#xff0c;26双非菜鸡&#xff0c;cpper. 但目前学了一些go &#xff0c;辅修吧&#xff0c;距离发的上个动态已经过去3个月了&#xff0c;真的觉得找实习时间来不及&#xff0c;现在leetcode 100多道题&#xff0c;前几天蓝桥杯整了个省二&#xff0c;把OS和…

Spark01 —— Spark基础

文章目录 Spark01 —— Spark基础一、为什么选择Spark&#xff1f;1.1 MapReduce编程模型的局限性1.2 Spark与MR的区别1.3 版本1.4 优势1.5 Spark其他知识1、多种运行模式2、技术栈3、spark-shell&#xff1a;Spark自带的交互式工具4、Spark服务 二、Spark的基础配置三、Spark实…