根据视频:看到递归就晕?带你理解递归的本质!_哔哩哔哩_bilibili内容整理
二叉树与递归:
- 如何思考二叉树相关问题?
- 为什么需要使用递归?
- 为什么这样写就一定能得出正确答案?
- 计算机是怎样执行递归的?
- 另一种递归思路
以二叉树的最大深度为例:
不要一开始就陷入细节,而是思考整棵树和左右子树的关系。
整棵树的最大深度 = max(左子树最大深度,右子树最大深度) + 1
原问题:计算整棵树的最大深度;子问题:计算左/右子树的最大深度;子问题和原问题是相似的。
类比循环,执行的代码也应该是相同的,但子问题需要把计算结果返回给上一级问题,这更适合用递归实现。
由于子问题的规模比原问题小,不断递下去,总会有个尽头,即递归的边界条件(base case)直接返回它的答案(归)。
代码如下:
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int maxleft = maxDepth(root.left);
int maxright = maxDepth(root.right);
return 1 + Math.max(maxleft, maxright);
}
}
另一种递归思路:
class Solution {
private int ans = 0;
public int maxDepth(TreeNode root) {
traversal(root, 0);
return ans;
}
private void traversal(TreeNode root, int cnt) {
if (root == null) {
return;
}
cnt++;
ans = Math.max(ans, cnt);
traversal(root.left, cnt);
traversal(root.right, cnt);
}
}