Leetcode112/113之二叉樹中遞迴式值傳遞和引用傳遞
阿新 • • 發佈:2022-04-12
二叉樹中遞迴式值傳遞和引用傳遞
- 在java中基本型別都是值傳遞,而非基本型別都是引用傳遞
- int是值傳遞,每次遞迴呼叫方法都是傳入一個值,遞迴呼叫結束之後,並不會影響原來的值,即不存在分支汙染問題
- String本身是引用傳遞,但是他比較特殊,String是final的,每次+或者賦值其實都是生成了一個新的String物件,即在遞迴過程中也不存在分支汙染問題,不需要回溯操作
- list是最容易犯錯的一個點,有時候會很容易忽略將list作為引數傳入之後,然後做了相應的修改,原方法的該list已經同步做了修改這點沒有意識到
- 如果不想回溯的話,類似於String那種,可以在每次遞迴呼叫的時候生成一份新的list傳入,這樣每次呼叫操作的list之間互不影響(但存在集合copy的大量時間空間開銷)
Leetcode112-路徑總和
-
給你二叉樹的根節點 root 和一個表示目標和的整數 targetSum 。判斷該樹中是否存在 根節點到葉子節點 的路徑,這條路徑上所有節點值相加等於目標和 targetSum 。如果存在,返回 true ;否則,返回 false 。
-
輸入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
-
輸出:true
public boolean hasPathSum(TreeNode root, int targetSum) { return isSum(root,targetSum,0); } public boolean isSum(TreeNode root, int targetSum,int sum){ if(root==null){ return false; } sum=sum+root.val; if(root.left==null && root.right==null){ if(sum==targetSum){ return true; }else{ return false; } } return isSum(root.left,targetSum,sum) || isSum(root.right,targetSum,sum); }
Leetcode113-路徑總和2
- 給你二叉樹的根節點 root 和一個整數目標和 targetSum ,找出所有 從根節點到葉子節點 路徑總和等於給定目標和的路徑。
- 輸入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
- 輸出:[[5,4,11,2],[5,8,4,5]]
LinkedList<List<Integer>> res = new LinkedList<>(); LinkedList<Integer> integers = new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root, int targetSum) { isSum(root,targetSum,0); return res; } public void isSum(TreeNode root, int targetSum,int sum){ if(root==null){ return; } sum+=root.val; integers.add(root.val); if(root.left==null && root.right==null){ if(sum==targetSum){ //要new一個集合進去,不然後面會被同步修改 res.add(new LinkedList<Integer>(integers)); } } isSum(root.left,targetSum,sum); isSum(root.right,targetSum,sum); // 要回溯,把當前的節點從集合中去除 integers.removeLast(); }