Skip to content

树、堆和图在面试里要讲到哪? ​

树表达层级。二叉树的遍历分前序、中序、后序和层序。堆是一棵用数组存的完全二叉树,用来取最值。图是顶点和边,遍历用深度优先或广度优先,并记住已经访问过的顶点。

原理 ​

二叉搜索树的中序遍历是有序的。平衡才谈得上查找 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 不标记访问,环上死循环。
  • 递归遍历深树时不提栈深度。

相关 ​