一、递归
递归很重要的两个条件:
1)确定终止条件;
2)递归的过程。
两个条件都需要细致地分析问题的细节。
二、算法题
1、Path Sum ,LeetCode第112题(注意递归的终止条件)
问题描述:给出一棵二叉树以及一个数字sum,判断在这棵二叉树上是否存在一条从根到叶子的路径,其路径上所有节点为sum
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root==null) return false;//如果传入的root为空,找不到对应子树
//if(root==null) return sum==0;
//该句是递归终止条件,确保root节点遍历到叶子节点。否则的话,使用上面一句,会有漏洞
if(root.left==null && root.right==null) return sum==root.val;
if(hasPathSum(root.left,sum-root.val)) return true;
if(hasPathSum(root.right,sum-root.val)) return true;
return false;
}
}
注意,一定要到叶子节点才递归终止。判断条件是if(root.left==null && root.right==null)。
2、Path SumⅡ,Leetcode 113题。
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> lists = new LinkedList<List<Integer>>();
List<Integer> list = new LinkedList<Integer>();
pathSum(root,sum,lists,list);
return lists;
}
public void pathSum(TreeNode root,int sum,List<List<Integer>> lists,List<Integer> list){
if(root==null) return;
list.add(root.val);
if(root.left==null && root.right==null && sum==root.val){//root为叶子节点,并且找到对应的值时,添加jieguo
lists.add(new LinkedList(list));
list.remove(list.size()-1);
return;
}else{
pathSum(root.left,sum-root.val,lists,list);
pathSum(root.right,sum-root.val,lists,list);
}
list.remove(list.size()-1);
}
}
3、Path SumⅢ,leetcode第437题。
问题描述:给出一棵二叉树以及一个数字sum,判断在这棵二叉树上存在多少条路径,其路径上所有的节点和为Sum。注意:
1)路径不一定要起始于根节点,终止于叶子节点
2)路径可以从任意节点开始,但是只可以向下走。
class Solution {
public int pathSum(TreeNode root, int sum) {
if(root==null) return 0;
int res = 0;
res += findPath(root,sum);//路径包含root节点的数量
res += pathSum(root.left,sum);//不包含root节点的路径数量,左边
res += pathSum(root.right,sum);//不包含root节点的路径数量,右边
return res;
}
public int findPath(TreeNode root,int sum){
if(root==null) return 0;//无需找到叶子节点
int res=0;
if(root.val==sum) res++;
res += findPath(root.left,sum-root.val);//前一句找到了一条路径,但是还可以继续向下搜寻
res += findPath(root.right,sum-root.val);
return res;
}
}