基本二叉树(空子树,左子树,右子树,完全二叉树,满二叉树)
二叉树的定义:
每个节点最多有两个子节点的树,通常称为右子节点,左子节点。
空子树:不包含任何节点
左子树:只有左边的节点
右子树:只有右边的节点
完全二叉树:除最外层其余层都是满的,是完全!!!连续不能断开的根节点到子节点
满二叉树:所有分支节点都有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语言(虽然现在也没有哈哈哈哈),我感觉就是链表的进阶版能够更好的处理一些问题,因为他设计到一些算法和计算后面我也会慢慢学习和总结的,我周末打算在做一个小项目来展示希望大家相互学习讨论,等到下个月或者是下下个月我会学完这个基础算法学习嵌入式开发板子的也会出一些详细的软件和开发的一些详细教程,希望大家有那些问题我们可以相互解决帮助)
和扩展我们的思维和运算能力,下面我们就开始学习简单的一些算法排序
冒泡排序
首先讲一下我们都熟悉的冒泡排序,什么是冒泡排序呢
比较相邻元素:从列表的第一个元素开始,比较相邻的两个元素。
交换位置:如果前一个元素比后一个元素大,则交换它们的位置。
重复遍历:对列表中的每一对相邻元素重复上述步骤,直到列表的末尾。这样,最大的元素会被"冒泡"到列表的最后。
缩小范围:忽略已经排序好的最后一个元素,重复上述步骤,直到整个列表排序完成
它是遍历,所有的元素,来把相邻的元素做对比然后交换位置
!!!注意注意这跟我我们生活当中的交换位置可不一样,在代码程序当中它是相当于找了个第三者,比如有一瓶可乐,一瓶果汁,这两瓶怎么交换呢,这就要用到我们的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