1. 程式人生 > >新手算法學習之路----二叉樹(二叉樹的路徑和)

新手算法學習之路----二叉樹(二叉樹的路徑和)

== style oid 添加 roo span 一個 int 二叉

題目: 給定一個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。

一個有效的路徑,指的是從根節點到葉節點的路徑。

代碼加思路

public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) {
         List<List<Integer>> Result = new ArrayList<>();
         List<Integer> path= new ArrayList<Integer>();
         
if(root == null){ return Result; } path.add(root.val); helper(Result, path,root.val,target,root); //這裏的根節點的值我一開始忘記加了,這是我的一個錯誤 return Result; } private void helper(List<List<Integer>>Result, List<Integer>path, int sum, int target, TreeNode root){
if(root.left == null&&root.right == null){//判斷已到達了葉子節點,如果到達了葉子節點的話還沒有和sum相等的話那就放棄這個path數組 if(sum == target){ Result.add(new ArrayList<Integer>(path)); } return; } if(root.left!= null){ //左子樹 path.add(root.left.val); helper(Result,path, sum
+root.left.val, target,root.left); path.remove(path.size()-1); //這個remove的作用是,如果找到了sum==target的路徑的話,由於每一在遍歷左子樹的時候就已經把每一個節點add到path數組裏面了,在最後一個節點那裏也已經將path值添加到了Result值裏面了,所以要將path清空留個下一個右節點。同時要想合理的刪除path裏面的內榮最好的辦法就是從後往前刪,這是remove的一個弊端。 } if(root.right != null){ path.add(root.right.val); helper(Result,path,sum+root.right.val, target, root.right); path.remove(path.size()-1); } }

新手算法學習之路----二叉樹(二叉樹的路徑和)