递归相关题目
文章目录
- 递归相关题目
-
- 一、[70. 爬楼梯](https://leetcode-cn.com/problems/climbing-stairs/)
- 二、[22. 括号生成](https://leetcode-cn.com/problems/generate-parentheses/)
- 三、[226. 翻转二叉树](https://leetcode-cn.com/problems/invert-binary-tree/)
- 四、[98. 验证二叉搜索树](https://leetcode-cn.com/problems/validate-binary-search-tree/)
- 五、[104. 二叉树的最大深度](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/)
- 六、[111. 二叉树的最小深度](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/)
- 七、[236. 二叉树的最近公共祖先](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/)
- 八、[105. 从前序与中序遍历序列构造二叉树](https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)
- 九、[77. 组合](https://leetcode-cn.com/problems/combinations/)
- 十、[46. 全排列](https://leetcode-cn.com/problems/permutations/)
- 十一、[47. 全排列 II](https://leetcode-cn.com/problems/permutations-ii/)
一、70. 爬楼梯
解法一:递归+记忆化搜索
public int climbStairs(int n) {
if (n<2) return n;
int[] a = new int[n+1];
a[1] = 1;
a[2] = 2;
return climbStairs(n, a);
}
private int climbStairs(int n, int[] a) {
if (a[n]!=0) return a[n];
a[n] = climbStairs(n-1, a) + climbStairs(n-2, a);
return a[n];
}
二、22. 括号生成
解法一:递归
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
solve(0, 0, n, new StringBuilder(), res);
return res;
}
private void solve(int left, int right, int n, StringBuilder sb, List<String> res) {
if (left==n) {
res.add(sb.toString());
return;
}
if (right<n) {
sb.append('(');
solve(left, right+1, n, sb, res);
sb.deleteCharAt(sb.length()-1);
}
if (left<right) {
sb.append(')');
solve(left+1, right, n, sb, res);
sb.deleteCharAt(sb.length()-1);
}
}
三、226. 翻转二叉树
3.1 解法一:递归,原地翻转
public TreeNode invertTree(TreeNode root) {
return solve(root);
}
private TreeNode solve(TreeNode node) {
if (node==null) return null;
TreeNode left = solve(node.right);
node.right = solve(node.left);
node.left = left;
return node;
}
优化:
public TreeNode invertTree(TreeNode root) {
if (root==null) return null;
TreeNode left = invertTree(root.right);
root.right = invertTree(root.left);
root.left = left;
return root;
}
四、98. 验证二叉搜索树
4.1 中序遍历+递归
private Long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root==null) return true;
if (!isValidBST(root.left)) {