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

题目

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

解题

求根结点到叶子结点的路径,这个路径的和等于target
深度优先
这里结点有左右两个子树,故要分别对左右子树深度搜索
下面程序和前序遍历很类似,毕竟前序遍历本身就是深搜

import java.util.ArrayList;
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */
public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> path = new ArrayList<Integer>();
        if(root == null)
            return result;
        FindPath(root,target,path,result);
        return result;
    }
    public void FindPath(TreeNode root,int target,ArrayList<Integer> path,
                         ArrayList<ArrayList<Integer>> result){
        if(target <0)
            return;
        if(target ==0 && root==null){
            ArrayList<Integer> p = new ArrayList<Integer>(path);
            if(!result.contains(p))
                result.add(p);
            return;
        }
        if(root ==null)
            return;
        path.add(root.val);
        ArrayList<Integer> path2 = new ArrayList<Integer>(path);
        FindPath(root.left,target - root.val,path,result);
        path.remove(path.size()-1);//回溯

        FindPath(root.right,target - root.val,path2,result);
        path2.remove(path2.size()-1);//回溯
    }
}

上面程序有问题。

在结点是空的时候开始判断路径是否符合要求,这样对于左右结点,都要进行判断,还都满足条件,出现了重复的情况,然而通过contains只保留不同的结果,对于树中真的有相同路径值而不同结点时候就会出现错误,还有个问题是target<0判断,当树结点值真的有负数的时候,也会出现错误

修改后程序

 import java.util.*;
 import java.util.ArrayList;

public class Solution {
    /** * @param root the root of binary tree * @param target an integer * @return all valid paths */
    public List<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        // Write your code here
        ArrayList<Integer> list = new ArrayList<Integer>();
        List<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        PathSum(root,target,result,list);
        return result;
    }
    public void PathSum(TreeNode root,int target,List<ArrayList<Integer>> result,ArrayList<Integer> list){
        if( root==null)
            return;

        if( (target ==root.val) && root.left==null && root.right==null){
            list.add(root.val);
            ArrayList<Integer> l = new ArrayList<Integer>(list);
            // if(!result.contains(l))
                result.add(l);
            return;
        }

        int val = root.val;
        list.add(val);

        ArrayList<Integer> list2 = new ArrayList<Integer>(list); 
        PathSum(root.left,target-val,result,list);
        list.remove(list.size()-1);
        PathSum(root.right,target-val,result,list2);
        list2.remove(list2.size()-1);
    }
}

你可能感兴趣的:(二叉树,遍历,剑指offer)