递归算法学习——Path Sum系列

一、递归

递归很重要的两个条件:

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;
    }
}

猜你喜欢

转载自blog.csdn.net/lxs1995/article/details/79854327