路径总和 i
法一、递归
bool sumNode(TreeNode* root, int targetSum, int sum) {
sum += root->val;
if (!root->left && !root->right) return sum == targetSum;
bool leftsum = false, rightsum = false;
if (root->left) leftsum = sumNode(root->left, targetSum, sum);
if (root->right) rightsum = sumNode(root->right, targetSum, sum);
return leftsum || rightsum;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == nullptr) return false;
return sumNode(root, targetSum, 0);
}
法二:迭代
迭代的第一种写法 ——使用两个栈分别记录
if (root == nullptr) return false;
stack<TreeNode*> st;
stack<int> stSum;
st.push(root);
stSum.push(root->val);
while (!st.empty()) {
TreeNode* node = st.top(); st.pop();
int sum = stSum.top(); stSum.pop();
if (!node->left && !node->right && sum == targetSum) return true;
if (node->left) {
st.push(node->left);
stSum.push(sum + node->left->val);
}
if (node->right) {
st.push(node->right);
stSum.push(sum + node->right->val);
}
}
return false;
迭代的第二种写法 —— 就使用一个栈记录。
if (root == nullptr) return false;
stack<pair<TreeNode*, int>> st;
st.push(pair<TreeNode*, int>(root, root->val));
while (!st.empty()) {
pair<TreeNode*, int> p = st.top(); st.pop();
if (!p.first->left && !p.first->right && p.second == targetSum) return true;
if (p.first->left) {
st.push(pair<TreeNode*, int>(p.first->left, p.second + p.first->left->val));
}
if (p.first->right) {
st.push(pair<TreeNode*, int>(p.first->right, p.second + p.first->right->val));
}
}
return false;
路径总和 ii
vector<vector<int>> res;
vector<int> path;
void findPath(TreeNode* node, int targetSum, int sum) {
path.push_back(node->val);
sum += node->val;
if (!node->left && !node->right && sum == targetSum) {
res.push_back(path);
}
if (node->left) {
findPath(node->left, targetSum, sum);
path.pop_back();
}
if (node->right) {
findPath(node->right, targetSum, sum);
path.pop_back();
}
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if (root == nullptr) return res;
findPath(root, targetSum, 0);
return res;
}