面试题精讲:数据结构
1. 红黑树 (Red-Black Tree)
面试核心: 为什么 Linux 内核、Python 字典(某些版本)和 Java HashMap 选择红黑树?
- 红黑树 vs AVL 树:
- AVL 树:严格平衡(任意节点左右子树高度差不超过1)。查询极快,但插入和删除时需要频繁旋转,开销大。
- 红黑树:非严格平衡。它通过牺牲一定的查询性能,换取了更低的增删成本(单次最多3次旋转)。
- 结论:
- 如果你的应用中 搜索次数远多于增删(如只读数据库),选 AVL。
- 如果 搜索、增删频率相当(如通用容器),红黑树 是最佳折中方案。
2. 经典递归与动态规划
2.1 台阶问题 (Fibonacci 变种)
一只青蛙一次可以跳 1 级或 2 级台阶,求跳上 n 级台阶的方法数。
- Python 3 最佳实践(空间优化迭代):
2.2 变态台阶问题
一次可以跳 1, 2, ..., n 级。
- 规律: 方法数等于 2 的 n-1 次方。
3. 杨氏矩阵查找
面试核心: 如何在行列皆有序的矩阵中寻找目标值?
- 思路: 从右上角(或左下角)开始寻找,排除整行/整列。
- 若当前值 > 目标:左移一列。
- 若当前值 < 目标:下移一行。
- 复杂度: 时间 O(m+n),空间 O(1)。
4. 链表高频技巧
4.1 成对调换链表节点
1->2->3->4 转换为 2->1->4->3
4.2 交叉链表求交点
核心思路: 浪漫相遇法,空间复杂度 O(1),无需计算链表长度差。 两个指针 A 和 B 同时出发,走完自己的链表就去走对方的链表,由于总路径相同,它们一定会在交点相遇(无交点则同时走到 None)。
4.3 单链表逆置
面试核心: 考察对指针(引用)变化的精确控制。
5. Python 实用容器操作
5.1 列表去重(保持顺序)
Python 3.7+ 字典是有序的,利用这一特性最简洁高效:
5.2 Python 创建字典的多种姿势
- 直接字面量:最常用且性能最好。
- 工厂方法 dict:支持元组列表或关键字参数。
- fromkeys 方法:初始化具有统一默认值的字典。
5.3 合并两个有序列表
归并排序的核心步骤,考查边界处理能力:
6. 基础排序与查找
6.1 二分查找
面试核心: 注意 mid 计算防止溢出的细节,以及边界条件的控制。
6.2 快速排序
面试核心: 分治思想。平均时间复杂度 O(n log n),空间复杂度取决于递归深度。
7. 二叉树高频考点
7.1 节点定义与层次遍历
7.2 深度优先遍历
利用系统栈实现,改变访问根节点的时机得到三种顺序:
7.3 其他基础考点
8. 其他经典算法
8.1 变位词判断
三种复杂度实现,从“暴力破解”到“空间换时间”:
8.2 找零问题
典型动态规划问题,避免重复计算:

