今日份递归题目。
虽然我没有掌握这题递归的精髓,但能独立想出来这种方法我觉得也挺好的了。利用到了栈。我是将每条路径上的和全部都求出来了。
而正常的递归方法是减去每一次遍历的节点,当减去到叶子节点和剩下的数字相同的话,那么这个时候就存在这条路径,否则就不存在。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
// 记录每一条路径的和
int sum = 0;
// 用栈记录需要回溯的和(有左右节点的位置)
stack<int> mask_stack;
// 定义函数来计算一棵树的所有路径的和,并将其存入一个容器中
void pathSum(TreeNode* node, vector<int>& vec){
// 递归结束条件
if(node == nullptr) return;
// 求每一条路径上的和
sum += node->val;
// 做标记,下一次要从哪里开始加(利用栈)
if(node->left != nullptr && node->right != nullptr)
mask_stack.push(sum);
// 代表这个节点是叶子节点(将这一路径的和存入容器,然后返回到分叉的路径)
if(node->left == nullptr && node->right == nullptr){
// 添加每条路径的和到容器中
vec.push_back(sum);
// 将sum值改为每一次节点分叉处(为另一条路径计算做准备)
if(!mask_stack.empty()){
sum = mask_stack.top();
mask_stack.pop();
}
}
// 递归遍历整棵树
pathSum(node->left, vec);
pathSum(node->right, vec);
}
public:
bool hasPathSum(TreeNode* root, int targetSum) {
// 树为空时的特殊情况
if(root == nullptr) return false;
// 定义记录每条路径和的容器
vector<int> allPathSum;
// 调用函数
pathSum(root, allPathSum);
// 遍历与目标值作比较
for(int i = 0; i < allPathSum.size(); i++){
if(allPathSum[i] == targetSum)
return true;
}
return false;
}
};