外观
树、堆和图在面试里要讲到哪?
树表达层级。二叉树的遍历分前序、中序、后序和层序。堆是一棵用数组存的完全二叉树,用来取最值。图是顶点和边,遍历用深度优先或广度优先,并记住已经访问过的顶点。
原理
二叉搜索树的中序遍历是有序的。平衡才谈得上查找 O(log n),退化成链就是 O(n)。前端很少手写平衡树,但要知道普通对象和 Map 不是二叉搜索树。
堆:父节点比两个孩子都小(小顶堆)或都大。插入和删除堆顶是 O(log n)。数组里下标 i 的孩子是 2i + 1 和 2i + 2。Top K、定时器里的最近任务可以用堆。排序里的堆排序是 O(n log n),不稳定。
图用邻接表最常见。BFS 用队列,适合无权最短路径。DFS 用栈或递归。有环时必须标记访问,否则死循环。边有权重时,最短路径才需要 Dijkstra 这类算法,前端面试讲清「无权用 BFS」通常就够。
DOM 是树。递归子节点是 DFS,按层处理是 BFS。虚拟 DOM 的 diff 只比较同层,不是在整棵树上找最相似的节点。
追问
前中后序的根在哪?
前序根在前,中序根在中间,后序根在后。层序按深度一层层走,用队列。
堆和二叉搜索树的差别?
堆只保证父和孩子的顺序,左右孩子之间没有顺序,所以不能用来做范围查找。它擅长反复取当前最值。
易错点
- 把堆说成始终完全有序的数组。只有堆顶是最值。
- 图的 DFS 不标记访问,环上死循环。
- 递归遍历深树时不提栈深度。