1. 程式人生 > 其它 >Leetcode112/113之二叉樹中遞迴式值傳遞和引用傳遞

Leetcode112/113之二叉樹中遞迴式值傳遞和引用傳遞

二叉樹中遞迴式值傳遞和引用傳遞

  • 在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();
    }