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();
    }
posted @ 2022-04-12 10:04  fao99  阅读(66)  评论(0)    收藏  举报