[LeetCode]Path Sum系列

1.二叉樹路徑求指定和,須要注意的是因爲有負數,因此即便發現大於目標值也不能返回false,並且返回true的條件有兩個,到葉節點且等於sum,缺一不可函數

public boolean hasPathSum(TreeNode root, int sum) {
        if (root==null) return false;
        if (root.val==sum&&root.left==null&&root.right==null) return true;
        else return hasPathSum(root.left,sum-root.val)||hasPathSum(root.right,sum- root.val);
    }

2.跟第一題的不一樣是要把全部路徑返回,作法同樣,把全部路徑都遍歷一遍,每次遞歸返回後都要回溯,把符合要求的路徑記錄spa

public List<List<Integer>> pathSum(TreeNode root, int sum) {
        List<List<Integer>> tp=new ArrayList<List<Integer>>();
        List<Integer> cu=new ArrayList<Integer>();
        int total=0;
        dfs(root, tp, cu,total,sum);
        return tp;
    }
    public void dfs(TreeNode root,List<List<Integer>> tp, List<Integer> cu,int total,int sum){
        if(root==null)
        return;
        cu.add(root.val);
        total=total+root.val;
        if(root.left==null&&root.right==null&&total==sum){
            tp.add(new ArrayList(cu));
            return;
        }
        if (root.left!=null){
            dfs(root.left,tp, cu,total,sum);
            cu.remove(cu.size()-1);
        }
        if (root.right!=null){
            dfs(root.right,tp, cu,total,sum);
            cu.remove(cu.size()-1);
        }
    }

 

3.不要求開頭和結尾是根節點和葉節點,可是順序必須自上而下,作法是遞歸的把全部節點都當作根節點判斷一遍,每次判斷時不一樣的地方是不用判斷到沒到葉節點,並且=target後不返回,只是結果+1,繼續向下判斷。code

 public int pathSum(TreeNode root, int sum) {
        int cu=0;
        if (root == null)
            return 0;
        return dfs(root,sum,cu)+pathSum(root.left,sum)+pathSum(root.right,sum);
        // 開始的點不必定是根節點,採起的方法是返回根節點函數+左子節點函數+右子節點函數,這樣遞歸後就能夠實現全部節點均可以做爲開始
    }
    public  int dfs(TreeNode root,int sum,int cu){
         int re=0;
         if (root == null)
            return re;
        cu+=root.val;
        if(cu == sum)
        re++;
        re+=dfs(root.left,sum,cu);
        re+=dfs(root.right,sum,cu);
        return re;
    }
相關文章
相關標籤/搜索