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