剑指offer_ 二叉树中和为某一值的路径

题目描述

输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12

 

 用递归遍历

 1 import java.util.ArrayList;
 2 /**
 3 public class TreeNode {
 4     int val = 0;
 5     TreeNode left = null;
 6     TreeNode right = null;
 7 
 8     public TreeNode(int val) {
 9         this.val = val;
10 
11     }
12 
13 }
14 */
15 public class Solution {
16     ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
17     private int t = 0;
18     ArrayList<Integer> road = new ArrayList<>();
19     public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
20         t=target;
21         find(root);
22         return ans;
23     }
24     
25     
26     public void find(TreeNode root){
27         if(root==null) return;
28         road.add(root.val);
29         if(root.left==null&&root.right==null){
30             int sum = 0;
31             for(Integer temp : road){
32                 sum+=temp;
33             }
34             if(sum==t)
35             ans.add(new ArrayList<>(road));
36         }
37         else{
38             find(root.left);
39             find(root.right);
40         }
41         road.remove(road.size()-1);
42     }
43 }

还有可以减少一点运算的方法,就是target判断

 1 private ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
 2 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
 3   backtracking(root, target, new ArrayList<>());
 4   return ret;
 5 }
 6 private void backtracking(TreeNode node, int target, ArrayList<Integer> path) {
 7 if (node == null)
 8   return;
 9 path.add(node.val);
10 target -= node.val;
11 if (target == 0 && node.left == null && node.right == null) {
12   ret.add(new ArrayList<>(path));
13 } else {
14   backtracking(node.left, target, path);
15   backtracking(node.right, target, path);
16 }
17   path.remove(path.size() - 1);
18 }

 

posted @ 2019-09-02 09:55  chyblogs  阅读(147)  评论(0)    收藏  举报