剑指offer-二叉树中和为某一值的路径简单版C++实现
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
TreeNode *left;
TreeNode *right;
int val;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {};
};
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if (!root)return false;
// 目标值
int num = 0;
// dfs
return dfs(root, sum, num);
}
// 先序遍历
bool dfs(TreeNode *root, int sum, int num) {
if (!root)return false;
// 增加当前节点值,若不满足条件回溯时会返回到上一个状态的目标值
num += root->val;
// 若此节点是叶子节点,且目标值与sum相等,那么则说明存在目标路径
if (!root->left && !root->right && num == sum)return true;
// 先遍历左子树再遍历右子树(先右后左也可)
return dfs(root->left, sum, num) || dfs(root->right, sum, num);
}
};
思路:
DFS遍历,枚举各个路径,每经过一个路径的节点时,便将值存到目标值num中,当到达路径的叶节点时,比较num与sum的值是否相等即可。
时间复杂度O(N),空间复杂度O(1)