递归的实现、特性以及思维要点
树的面试题一般都是 递归
- 节点的定义
- 重复性(自相似性)
递归 Recursion
def Factorial(n): if n <= 1: return 1 return n * Factorial(n - 1)
<a name="7aFkK"></a>
## 递归的步骤
- 1. 递归终结条件
- 2. 处理当前层逻辑
- 3. 下探到下一层
- 4. 清理当前层
<a name="vO5zi"></a>
## Python 代码模板
```python
def recursion(level, param1, param2, ...):
# recursion terminator
if level > MAX_LEVEL:
process_result
return
# process logic in current level
process(level, data...)
# drill down
self.recursion(level + 1, p1, ...)
# reverse the current level status if needed
Java 代码模板
public void recur(int level, int param) {
// terminator
if (level > MAX_LEVEL) {
// process result
return;
}
// process current logic
process(level, param);
// drill down
recur(level: level + 1, newParam);
// restore current status
}
递归的思维要点
- 不要人肉进行递归、也就是画图(最大误区)
- 找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
- 数学归纳法
实战题目:爬楼梯、括号生成等问题
爬楼梯(70)
- 1:1
- 2:2
- 3:f(1) + f(2)
- // 跨一步台阶,从2这个台阶走上来;跨两步,从1这个台阶走上来
- 1 的台阶的总走法,跨两步跨上3;或是 2 这个台阶的总走法,跨一步跨上 3
- 4:f(2) + f(3)
- …
- f(n) = f(n -1) + f(n - 2): Fibonacci
括号生成(22)
- 翻转二叉树(226)
- 验证二叉搜索树(98)
- 二叉树的最大深度(104)
- 二叉树的最小深度(111)
- 二叉树的最近公共祖先(236)