牛客刷題——二叉樹路徑和為sum的路徑
阿新 • • 發佈:2021-03-12
題目:
給定一個二叉樹和一個值sum,請找出所有的根節點到葉子節點的節點值之和等於sum的路徑,
例如:
給出如下的二叉樹,sum=22sum=22,返回
[[5,4,11,2],
[5,8,9]]
確認了,二叉樹的問題確實是演算法上比較容易做出的問題,因為基本離不開樹的遍歷。。。
這道題目的思路還是比較清楚的,先序遍歷,累加,記錄路徑,到達根節點進行比較,累加和等於 sum 的話,將該路徑儲存起來,否則丟棄。
但是有個需要注意的點,由於這道題目是多解的,在進行遍歷的過程中可能有多個答案,因此在進行儲存的時候,要以當前的路徑 path 作為引數,新建一個List,為什麼要新建呢,因為在進行遍歷的過程中,當我們在遍歷完左葉子結點的時候,無論結果如何,我們需要遞歸回到上一次,去判斷右葉子節點是不是符合要求的,這時候我們需要的路徑是回到其父節點,然後走到右節點,但是左節點已經加到 list 中了,所以在遞迴中的最後一步,我們需要將 list 中的該元素刪掉,刪掉之後 path 在層層往前返回的時候會重複執行這個操作,最終導致結果為空的了,所以需要新建。
完整程式碼如下:
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) { // write code here ArrayList<ArrayList<Integer>> res = new ArrayList<>(); ArrayList<Integer> path = new ArrayList<Integer>(); getPath(root, res, 0, sum, path); return res; } public static void getPath(TreeNode root,ArrayList<ArrayList<Integer>> res,int count,int sum,ArrayList<Integer> path) { if(root!=null) { count += root.val; path.add(root.val); }else { return; } if(root.left==null&&root.right==null&&count==sum) { res.add(new ArrayList<>(path)); } getPath(root.left, res, count, sum, path); getPath(root.right, res, count, sum, path); path.remove(path.size()-1); }