目录
一、递归代码模板
public void recur(int level,int param) {
//终止条件
if(level > MAX_LEVEL){
return;
}
//处理过程
process(level,param);
//下钻
recur(level + 1,newParam);
//存储当前状态(按需书写)
}
二、思维要点
三、示例题目
22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
输入:n = 1
输出:["()"]
class Solution {
private ArrayList<String> res;
public List<String> generateParenthesis(int n) {
res = new ArrayList<String>();
generate(n,0,0,"");
return res;
}
public void generate(int n,int left,int right,String str){
if (left == n && right == n){
res.add(str);
}
if (left < n) {
generate(n,left+1,right,str+"(");
}
if (left > right) {
generate(n,left,right+1,str+")");
}
}
}
226. 翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right =left;
return root;
}
}
98. 验证二叉搜索树
完成这道题,共有三种方法:递归,迭代,中序遍历
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
class Solution {
public boolean isValidBST(TreeNode root ){
return recurse(root,null,null);
}
public boolean recurse(TreeNode root,Integer lower,Integer upper){
if(root == null) {
return true;
}
int val = root.val;
if (lower !=null && val < lower) return false;
if (upper != null && val > upper) return false;
if(!recurse(root.right,val,upper)) return false;
if (!recurse(root.left,lower,val)) return false;
return true;
}
}