用先序去判断根,在中序中定位到根的位置,将左右分开,再在先序中判断第二层的根,依此类推,将整个树画出来。
用先序去判断根,在中序中定位到根的位置,将左右分开,再在先序中判断第二层的根,依此类推,将整个树画出来。
## 二叉树
### 性质
- 第i层有2(i-1)个节点
- 深度为k的二叉树至多有2^k-1个节点。
- 如果节点为N0,度数为2的节点为N2,N0=N2+1
- 具有n个节点的完全二叉树深度为log(n+1)
- 平衡二叉树:当且仅有任何节点的两棵子树的高度差不大于一的二叉树
- 排序二叉树
### 霍夫曼树
> 带权路径最短的二叉树称为霍夫曼树
### B树
> 一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多于两个子树。
## 树的存储与表述
- 顺序存储,用数组
- 链式存储,指针域指针个数不稳定。
### 常见的树的应用
- html
- mysql
- 文件目录
- 路由协议
## 二叉树的遍历
> 深度优先遍历一般用递归,广度优先一般用队列。一般情况下能使用递归实现的算法大部分也能使用堆栈来实现。
## 八、搜索
> 在一个序列中查找某个元素是否存在。
### 二分法查找
> 优点:比较次数少,查找速度快。
### 归并排序时间复杂度与插入排序复杂度对比
> 归并排序中每个层级的合并比较时间复杂度都为n,一共合并了log2n次,所以时间复杂度为O(nlogn)。最坏最优情况相同。
> 稳定性:稳定。
> 区别是拿到的是一个新的列表,从时间看是小的,但从空间上,占用了额外的内存。
## 七、归并排序
> 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
> 将数组分解最小后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
## 六、快速排序
> 又称为划分交换排序,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据药效,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序数列
> 步骤
- 从数列中挑出一个元素,成为基准
- 重新排序数列,所有元素比基准小的值摆放在基准前面,所有元素比基准大的值摆在基准后面。在这个分区结束后,该基准就处于数列的中间位置,称为分区操作
- 递归低把小于基准值元素的子数列和大于基准值元组的子数列排序,
。
## 五、希尔排序
> 希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法
### 希尔排序过程
> 基本思想:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列来进行,最后整个表就只有这一列了。将数组转换至表是为了更好的理解这算法,算法本身还是用数组进行排序。
### 时间复杂度
- 最优时间复杂度: O(n)
- 最坏时间复杂度:O(n*2)
- 稳定性,稳定
## 插入算法
## 三、选择排序
### 时间复杂度
- 最优时间复杂度:O(n**2)
- 最坏时间复杂度:O(n**2)
- 稳定性:不稳定
## 冒泡排序
> 重复地遍历要排序的数列,一次比较两个元素。
### 时间复杂度
- 最优时间复杂度: O(n)
- 最坏时间复杂度:O(n**2)
- 稳定性:稳定
## 排序与搜素
> 排序算法是一种能将一串数据按照一定顺序进行排列的一种算法
### 排序算法的稳定性
> 稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。
## 队列的实现
## 双端队列
> 概念:是一种具有队列和栈的性质的数据结构
> 双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两顿进行。双端队列可以在队列任意一端入队和出队。
## 栈的实现
> 栈可以用顺序表或链表实现
- 压栈(入栈)
- 出栈
# 栈与队列
##栈
> 概念:栈,也称为堆栈,是一种容器,可存入数据元素,访问元素、删除元素。它的特点在于只能允许在容器的一段进行加入数据和输出数据的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。
> 原理运作:后进先出
> 顺序表与链表提供的是数据存放的方式。
## 队列
> 队列是只允许在一段进行插入操作,而在另一端进行删除操作的列表。
> 队列是一种先进先出的线性表。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!
## 单向循环链表
> 让尾节点指向头节点。
## 双向链表:
> 定义:一种更复杂的链表。每个节点有两个链接,一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。
- 后继节点:当前节点的下一个
- 前驱节点:当前节点的前一个
## 链表与顺序表的对比
> 链表可以将分散的存储数据连接。适合存储数据量较大的存储。
> 链表的主要耗时操作是便利查找。顺序表查找很快,主要耗时操作时拷贝覆盖。因为除了目标元素在尾部的特殊情况。顺序表进行插入和删除时需要对操作点之后的所有元素进行后移位操作,只能通过拷贝和覆盖的方法进行。
## 单链表的代码