在使用递归时若需要对一个参数进行累加等操作,不可将其作为参数传入递归函数中,应该定义在类的属性里,而不能传参到递归中,这样参数的值不能保证统一,因为递归一般是自下向上运行,传参一般都是自上向下传,下面运行完改变了参数是无法传给上面一层递归的。
对比段代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minCameraCover(TreeNode root) {
int result = 0;
if(cameraCover(root, result) == 0){
result++;
}
return result;
}
/**
2->有覆盖
1->有摄像头
0->无覆盖
*/
public int cameraCover(TreeNode root){
if(root == null) return 2;//null结点表示有覆盖
int left = cameraCover(root.left, result);
int right = cameraCover(root.right, result);
if(left == 2 && right == 2){
return 0;
}
if(left == 0 || right == 0){
result++;
return 1;
}
if(left == 1 || right == 1){
return 2;
}
return - 1;
}
}
结果错误,result始终的不到更新
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int result = 0;// result是全局变量
public int minCameraCover(TreeNode root) {
if(cameraCover(root) == 0){
result++;
}
return result;
}
/**
2->有覆盖
1->有摄像头
0->无覆盖
*/
public int cameraCover(TreeNode root){
if(root == null) return 2;//null结点表示有覆盖
int left = cameraCover(root.left);
int right = cameraCover(root.right);
if(left == 2 && right == 2){
return 0;
}
if(left == 0 || right == 0){
result++;
return 1;
}
if(left == 1 || right == 1){
return 2;
}
return - 1;
}
}
结果正确