应用级排行
· T0 地狱级(根本写不对):动态树(Link-Cut-Tree) 与 可持久化线段树(主席树)。前者需同时维护虚实链、翻转标记和Splay,思维维度极高;后者要求在历史版本间共用节点,区区几行递归能把人绕晕在时间线里。
· T1 噩梦级(删除比命长):红黑树和B树的删除操作。相比于插入,删除要处理“双黑”、“借位”、“合并”等十几种旋转case,面试让你手撕红黑树纯属刁难;B树的节点分裂与合并更是数据库内核的拦路虎。
· T2 极度抽象(代码短但烧脑):后缀自动机(SAM)。每个状态维护len、link和next,构建时clone节点逻辑极其反直觉,堪称“让人怀疑人生的数据结构”。
· T3 繁琐易错(细节狂魔):线段树的复杂懒标记(区间乘加、区间赋值、历史最值)。难点不在树结构,而在多个标记的运算顺序(先乘后加还是先加后乘),稍有疏忽整个区间的值全乱套。
· T4 经典陷阱(眼高手低):二叉树的非递归后序遍历与 KMP的next数组推导。看着简单,但不用递归手写后序,栈的进出逻辑极容易死循环;KMP的回溯思想更是让无数初学者反复“悟道”。
408排行
· Top 1 图的应用大题(崩溃之王):Dijkstra最短路径和关键路径的手算模拟。前者每轮选错一个点,后面全盘皆错;后者求ve、vl、e、l四个数组,顶点和边的余量极易混淆,是408应用题的高频失分点。代码大题则爱考邻接表/矩阵的DFS/BFS非递归。
· Top 2 二叉树的非递归遍历(代码噩梦):408手写代码最爱考后序非递归,需要额外加标记位或辅助指针判断右子树是否访问过,比递归难写十倍;线索二叉树找前驱/后继的规则(ltag/rtag)更是选择题绕不出去的坑。
· Top 3 B树的插入与删除(概念黑洞):删除要分“兄弟够借(左旋/右旋)”和“兄弟不够(合并)”,且合并后父节点关键字减少,可能导致连锁反应。408不考代码,但应用题让你画出最终B树形态,极易漏掉上溢/下溢的调整步骤。
· Top 4 KMP的next/nextval数组(眼高手低):看似就几行递推,但手算时next[j]取最长相等前后缀长度+1,nextval优化又要在失配时递归,408选择题年年有,但换个字符串就有人算错。
· Top 5 排序过程的“第几趟”与堆调整:快速排序每趟结束后的定轴元素位置;堆排序初始建堆(从最后一个非叶节点向下调整)和删除堆顶后的重建,手画出每一层的交换过程非常考验细心。