方法1,类似于求二叉树的高度,有返回值
看到函数中递归调用并且进行了返回的情况,这种时候一般从下往上理解,进行理顺会更好。如下面的两个语句,最后都在递归中产生了效果。
lsum=Sum(T->left);
rsum=Sum(T->right);
int Sum(TreeNode* T){
if(T==NULL)return 0;
int sum=0;
int lsum,rsum;
lsum=Sum(T->left);
rsum=Sum(T->right);
sum=T->val+lsum+rsum;
return sum;
}
方法2,利用一个外部变量,每次遍历的时候都访问一下,修改一下这个外部变量
函数调用中没有返回,可以从上往下理解,当然,也可以从下往上理解,这个类似于树的遍历访问。
int Sum(TreeNode* T,int& sum){
if(T==NULL)return 0;
sum+=T->val;
Sum(T->left,sum);
Sum(T->right,sum);
}
典型例题leetcode437
class Solution {
public:
int pathSum(TreeNode* root, int sum) {
if(root==NULL)return 0;
int count=0;
helper(root,sum,count);
int lres,rres;
lres=pathSum(root->left,sum);
rres=pathSum(root->right,sum);
return count+lres+rres;
}
void helper(TreeNode* T,int sum,int& count){
if(T==NULL)return;
int res=sum-T->val;
if(res==0)count++;
helper(T->left,res,count);
helper(T->right,res,count);
}
};