1. 程式人生 > >【劍指Offer】 24、二叉樹中和為某一值的路徑

【劍指Offer】 24、二叉樹中和為某一值的路徑

new tro urn 前序遍歷 addall sort pub remove http

??題目描述:

??輸入一顆二叉樹的根結點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(註意: 在返回值的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;
        }
    }
}

【劍指Offer】 24、二叉樹中和為某一值的路徑