news 2026/2/1 5:02:49

二叉树基础与排序算法解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树基础与排序算法解析

基本二叉树(空子树,左子树,右子树,完全二叉树,满二叉树)

二叉树的定义:

每个节点最多有两个子节点的树,通常称为右子节点,左子节点。

空子树:不包含任何节点

左子树:只有左边的节点

右子树:只有右边的节点

完全二叉树:除最外层其余层都是满的,是完全!!!连续不能断开的根节点到子节点

满二叉树:所有分支节点都有2个孩子,所有叶节点都在最后一层(就像树的叶子是最后一个连接的)

二叉树的性质

度 :从该节点出发的变

度0:没有节点

度1没有节点以此类推

叶的节点数

咱们的n0就代表度为0的数目,n1就是代表度为1,n2呢就是代表度为2。首先我们来看怎么推导的,这个也比较重要的。

首先树的总节点数,含有度为0和度1和度2的总和嘛,分别是n0,n1,n2.

还等于边数加上1,因为每个节点向上的连接线不就代表有一个节点吗,但根节点也算一个但没有向上的边,要加上一个就是(边数+1)等于所有节点数+1(不就相当于查伸了几个枝干加上最后一个根自己吗)

还等于前面不是说等于所有节点数加一嘛,节点数,不就是相当于每个度相加吗我们知道度0贡献0个节点就是0+度1贡献1*n1个度2贡献2*n2个综合就算n1+2n2+1这就能推导出

n0=n2+1;

每层的节点数

以上,是简易的二叉树的性质以及基础定义当然我们学这个东西只是为了方便我们学习算法

(写上个人理解,想我之前对数据结构了解没有那么深刻还有就是c语言(虽然现在也没有哈哈哈哈),我感觉就是链表的进阶版能够更好的处理一些问题,因为他设计到一些算法和计算后面我也会慢慢学习和总结的,我周末打算在做一个小项目来展示希望大家相互学习讨论,等到下个月或者是下下个月我会学完这个基础算法学习嵌入式开发板子的也会出一些详细的软件和开发的一些详细教程,希望大家有那些问题我们可以相互解决帮助)

和扩展我们的思维和运算能力,下面我们就开始学习简单的一些算法排序

冒泡排序

首先讲一下我们都熟悉的冒泡排序,什么是冒泡排序呢

  1. 比较相邻元素:从列表的第一个元素开始,比较相邻的两个元素。

  2. 交换位置:如果前一个元素比后一个元素大,则交换它们的位置。

  3. 重复遍历:对列表中的每一对相邻元素重复上述步骤,直到列表的末尾。这样,最大的元素会被"冒泡"到列表的最后。

  4. 缩小范围:忽略已经排序好的最后一个元素,重复上述步骤,直到整个列表排序完成

它是遍历,所有的元素,来把相邻的元素做对比然后交换位置

!!!注意注意这跟我我们生活当中的交换位置可不一样,在代码程序当中它是相当于找了个第三者,比如有一瓶可乐,一瓶果汁,这两瓶怎么交换呢,这就要用到我们的Temp空瓶子,先把可乐倒入空瓶里面,然后呢把果汁导入我们的可乐瓶,再把空瓶里面装的可乐瓶子倒入到我们原先的可乐瓶里面.

用代码的话就是 b = a; temp = b ; a = temp ;这下a和b的值就交换了剩下只有遍历就好了

这个冒泡排序的优点比较直观比较容易理解

缺点就是万一每个都要比较的话就是时间复杂度比较高的

  • 效率较低,尤其是对于大规模数据集。

  • 不适合处理几乎已经有序的列表,因为仍然需要进行多次遍历。

  • 时间复杂度为0(n2)

下面展示一下基础代码

首先就是遍历,之后就是交换

#include <stdio.h>
void bubble_sort(int arr[], int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main() {
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
int i;
for (i = 0; i < len; i++)
printf("%d ", arr[i]);
return 0;
}

可能有的同学会问,这个前面学的栈里面,数组传入进去不是首地址吗,是的这是个好问题,它会把int arr[],看成int *arr ,在mian函数里面初始化的arr是在main函数结束后销毁的,当然也会在函数销毁掉。

有人会问了,这个在函数结束销毁掉那排序的呢,首先你可以理解main函数只知道arr房间的门牌号,传入了排序函数里面,它打开门之后把数字排序完之后,销毁忘记的只是门牌号和变量i,j,temp,房间内容已经被动了。

有哪些不理解的地方我们可以相互讨论谢谢大家!!!

我接下会创建一个群聊,希望我们学者也可以相互学习,我就是一个小白,不过可以帮助大学里面学习的基础c语言免费回答感谢感谢!!!QQ群号:238038904

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/25 2:58:39

CVAT标注工具:快速验证你的AI模型原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 使用CVAT标注工具&#xff0c;快速标注50张工业缺陷检测图片。标注缺陷区域&#xff08;如划痕、凹陷&#xff09;&#xff0c;支持多边形和矩形标注。导出为YOLO格式&#xff0c;直…

作者头像 李华
网站建设 2026/2/1 4:31:01

传统开发vs快马AI:导师评价系统开发效率提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个功能完整的导师评价系统&#xff0c;要求&#xff1a;1)实现传统手工编码与AI生成代码的并行开发对比 2)在代码注释中标注各模块耗时 3)包含单元测试和性能测试代码 4)输出…

作者头像 李华
网站建设 2026/1/25 0:07:19

VS2017入门指南:从安装到第一个C++项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个VS2017新手引导插件&#xff0c;提供交互式教程&#xff0c;指导用户完成安装、配置和第一个C项目的创建。插件应包括步骤演示、视频教程和实时帮助功能&#xff0c;支持常…

作者头像 李华
网站建设 2026/1/25 5:56:12

Vim与Vi:编辑器之王的完整演进史

第一章&#xff1a;历史溯源与哲学根基 1.1 Vi的诞生&#xff1a;Unix时代的文本编辑革命 时间背景&#xff1a;1976年&#xff0c;Unix操作系统正在蓬勃发展&#xff0c;但当时的文本编辑器存在明显不足。早期的行编辑器ed虽然功能强大&#xff0c;但缺乏直观性。屏编辑器ex虽…

作者头像 李华
网站建设 2026/1/29 13:52:34

NtLogV4

public class NtLogV4 //可能无法使用 {private Queue<LogContentV4> buffer new Queue<LogContentV4>();public string LogPath { get; }private string curfilepath string.Empty;private string errorLgFile string.Empty; //定义从Exception到Fault这5个…

作者头像 李华
网站建设 2026/1/16 11:13:45

springboot基于vue的城科高校跳蚤二手商城系统设计与实现_r7e85p1m

目录已开发项目效果实现截图已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部…

作者头像 李华