javascript只支持一维数组,但是通过在数组里面保存数组元素的方式,可以轻松创建多维数组。
//最简单的实现
var arr = [[1,2],[2,3],[3,4]];Dummy node(哑节点)是链表问题中的一个重要的技巧,它是一个虚拟节点,就是在链表表头head前加一个节点指向head,即dummy -> head。
它的作用是保证链表的head不会在删除操作中丢失,当链接的head有可能变化时,使用dummy node可以很好的简化代码,最终返回dummy.next即新的链表。
快慢指针指的是向前移动的步长,每次移动的步长较大的即为快指针,步长较小的即为慢指针。常用的快慢指针一般是在单链表中让快指针每次向前移动2,慢指针则每次向前移动1。快慢指针主要有两个应用:
-
快速找出未知长度的链表的中间节点
设置两个指针
fast和low,都指向单链表的头节点,由于fast的移动速度是slow的2倍,所以当fast指向末尾节点的时候,slow刚好就在中间。 -
判断单链表是否有环
利用快慢指针的原理,由于
fast的移动速度是slow的2倍,如果fast == null说明该单链表以null结尾,不是循环链表;如果fast == slow,则快指针追上慢指针,说明该链表是循环链表。
-
二叉树
二叉树是每个节点最多有两个子树的树结构,子树有左右之分。二叉树常用于实现
二叉查找树和二叉堆。 -
二叉树的节点计算
-
满二叉树
-
完全二叉树
深度为k,有n个节点的二叉树,当前仅当每个节点都与深度为k的满二叉树中序号为1至n的节点对应时,称之为完全二叉树。完全二叉树中重在
节点标号对应。
-
深度优先
先访问子节点,再访问父节点,最后访问第二个子节点。根据根节点相对于左右节点的访问先后顺序可细分为以下三种方式:
- 前序:先根后左再右
- 中序:先左后根再右
- 后序:先左后右再根
前中后是相对于
根节点的访问来说的。 -
广度优先
先访问根节点,沿着树的宽度遍历子节点,直到所有的节点均被访问为止。
二叉查找树的特点
-
每个节点的键都大于等于左子树中的任意节点的键,而小于右子树的人鱼节点的键。
-
使用
中序遍历可得到有序数组。
可统计针对每个节点被访问的次数,进而求的总的时间复杂度。
-
一般情况下,堆是指
二叉堆,是一个近似完全二叉树的数据结构,即披着二叉树羊皮的数组。故用数组来实现较为便利。 -
堆有最大值堆和最小值堆
-
常用作实现优先队列。
-
以数组表示,但是以完全二叉树的方式理解。
-
唯一能够同时最优利用空间和时间的方法-最坏情况下也能保证
2NlogN次比较和恒定的额外空间。 -
索引从0开始的数组中:
- 父节点
i的左子节点在位置2*i+1 - 父节点
i的右子节点在位置2*i+2 - 子节点
i的父节点在位置floor((i-1)/2)
- 父节点
以最大值堆为例,堆的常用操作如下
-
最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点
-
创建:进行最大堆调整
-
移除:需要进行最大堆调整的递归运算



