五大算法
- 贪心算法:局部最优解法
- 分治算法:分成多个小模块,与原问题性质相同
- 动态规划:每个状态都是过去历史的一个总结
- 回溯法:发现原先选择不优时,退回重新选择
- 分支限界法:按广度优先策略搜索问题的解空间树,适合求解最优化问题
数据树
- 二叉树: 最多只有两个子节点 - 完全二叉树- 若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边
 
- 满二叉树- 深度为 h, 有 n 个节点,且满足 n = 2^h - 1
 
- 平衡二叉树- 它或者是一颗空树,或它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树
 
- 最优二叉树(哈夫曼树)- 树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
 
 
- 完全二叉树
- 二叉查找树: 是一种特殊的二叉树,能有效地提高查找效率 - 小值在左,大值在右
- 节点 n 的所有左子树值小于 n,所有右子树值大于 n
 

- 遍历节点- 前序遍历- 根节点
- 访问左子节点,回到 1
- 访问右子节点,回到 1
 
- 中序遍历- 先访问到最左的子节点
- 访问该节点的父节点
- 访问该父节点的右子节点, 回到 1
 
- 后序遍历- 先访问到最左的子节点
- 访问相邻的右节点
- 访问父节点, 回到 1
 
 
- 前序遍历
DLR–前序遍历(根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 )

LDR–中序遍历(根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

LRD–后序遍历(根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面)

- 插入与删除节点
写出一个方法输出1-100内的所有素数
解析: 由素数(质数)定义可知:
- ① 0、1都不是质数,那么最小的质数就是2。
- ② 除了1和它自身,不能被其他数整除,那么代码表达式表示为:
| 1 | i % j === 0 | 
- 代码实现
| 1 | function fn() { | 
(数组中第K大元素)给定一个整数数组,实现快速排序算法进行升序排列。如[2, 5, 8, 9, 3] =>[2, 3, 5, 8, 9]
解析:(分治法) 将一个列表分割为左右两块,然后再将字列表再进行分割为左右两块,如何反复,知道子元素长度为1时,结束!
- 代码实现1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13function qSort(arr) { 
 if (arr.length <= 1) return arr
 const index = Math.floor(arr.length / 2)
 const midVal = arr.splice(index, 1)[0]
 const left = [],
 right = []
 arr.forEach(item => {
 if (item < midVal) left.push(item)
 else right.push(item)
 })
 return [...qSort(left), midVal, ...qSort(right)]
 }
 qSort([2, 5, 8, 9, 3])
求一个字符串中最长的非重复连续子串
| 1 | function find(s) { | 
求字符串数组的最长公共前缀
比如输入: [“flower”,”flow”,”flight”],输出: “fl”
| 1 | var longestCommonPrefix = function(strs) { | 
实现二叉树(构建、遍历)
| 1 | function TreeCode() { | 
二叉树的非递归遍历
深度优先非递归(栈的先进后出)DFS
| 1 | function DepthFirstSearch(biTree) { | 
广度优先非递归(队列的先进先出)BFS
| 1 | function BreadthFirstSearch(biTree) { | 
一个数组,里面是排好序的数字,输入一个数字怎么能找到它的index
把这些数字放到对象的key里,index变成value,然后直接取 时间复杂度O(n) => O(1)
二分法查找
| 1 | let arr = [0, 1, 2, 4, 5, 6, 7, 8]; | 
洗牌(乱序)算法
时间复杂度:O(n²)
| 1 | function shuffle(arr) { | 
时间复杂度:O(n)空间复杂度O(1)
| 1 | function shuffle(arr) { | 
两数之和
[2,7,11,88,34],9 => [0,1]
双循环
| 1 | function twoSum(arr, target) { | 
Map
| 1 | function(arr, target) { | 
假设有130个苹果,你我轮流拿,每次可拿1-5个,如何保证你拿到最后一个苹果
巴什博奕嘛保证剩最后6个给对面取,先取者可必胜,第一次取4个,剩126个,对面随便取,取的时候保证一直剩余6的倍数,最后一定出现剩6个苹果的情况。
手动控制并发请求fetchWithLimit
| 1 | function fetchWithLimit(urls, max, callback) { | 
有一个数n=5,不用for循环,怎么返回[1,2,3,4,5]这样一个数组
| 1 | function getArr(n) { | 
判断单链表是否有环
| 1 | function main(node){ | 
 
        