【剑指Offer】 24、二叉树中和为某一值的路径

  题目描述:

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

  解题思路:

  本题实质上就是深度优先搜索。使用前序遍历的方式对整棵树进行遍历,当访问到某一个结点时,将该结点添加到路径上,并且累加该结点的值。当访问到的结点是叶结点时,如果路径中的结点值之和正好等于输入的整数,则说明是一条符合要求的路径。如果当前结点不是叶结点,则继续访问它的子结点。

  当找到一条符合要求的路径之后,需要回溯进一步查找别的路径,因此,这实际上仍然是一个递归的过程,特别注意在函数返回之前要删掉当前结点,从而才可以正确的回溯。

  举例:

  编程实现(Java):

public class Solution {
    private ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    private lengthCompare c=new lengthCompare();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root==null)
            return res;
        ArrayList<Integer> temp=new ArrayList<>();
        FindPath(root,target,temp);
        res.sort(c);
        return res;
    }
    public void FindPath(TreeNode root,int target,ArrayList<Integer> temp){
        temp.add(root.val);
        if(root.left==null && root.right==null){ //root是叶结点
            if(root.val==target) {//找到了一条路径
                ArrayList<Integer> list=new ArrayList();
                list.addAll(temp);
                res.add(list);
            }
        }
        else{
            if(root.left!=null)
                FindPath(root.left,target-root.val,temp);
            if(root.right!=null)
                FindPath(root.right,target-root.val,temp);
        }
        if(temp.size()!=0) //回溯
            temp.remove(temp.size()-1);
    }
    class  lengthCompare implements Comparator<ArrayList>{
        public int compare(ArrayList a,ArrayList b){
            if(a.size()>b.size())
               return -1;
            else if(a.size()==b.size())
                return 0;
            else
                return 1;
        }
    }
}
posted @ 2019-04-30 15:12  gzshan  阅读(1342)  评论(0编辑  收藏  举报