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