有种不错的方法符合我刚开始想使用数组的设想。
见这篇博文:其中每次都将新遍历到的节点,都加到整个数组中,这样,当前数组中存储的每一个位置(i:从0到size-1)的值,代表的是----从该位置(i)出发,到达新遍历的这个节点的路径和。----其实有种动归的思想在里面。这个操作简直太妙了,另一个妙的地方,即数组设为传值调用,使得每次都能回到原来的状态,然后再从那个状态到那个状态的另一个子树去遍历,这样不会造成问题。所以我们这个数组在内存里的最大长度,也就子树的最大深度。
class Solution {
public:
int ret;
int pathSum(TreeNode* root, int sum) {
if(root == NULL) return 0;
vector<int> v;
sov(root,sum,v);
return ret;
}
void sov(TreeNode* root, int sum,vector<int> v){
v.push_back(0);
for(int i = 0; i < v.size(); i++){
v[i] += root->val;//每一个都加上
if(v[i] == sum) ret++;
}
if(root->left != NULL) sov(root->left,sum,v);
if(root->right != NULL) sov(root->right,sum,v);
}
};