题目来源:https://leetcode.cn/problems/path-sum/description/
C++题解1:递归法,前序遍历。先把当前节点加入sumtmp,再判断是不是叶子节点,如果是则判断sumtmp与targetSum的大小,不是则对其左右子树再次进行遍历。
class Solution {
public:bool sumlujing(TreeNode* node, int targetSum, int sumtmp) {sumtmp = sumtmp + node->val;if(node->left == nullptr && node->right == nullptr) {if(sumtmp == targetSum) return true;else return false;}bool lf = false, rf = false;if(node->left) lf = sumlujing(node->left, targetSum, sumtmp);if(lf) return lf; if(node->right) rf = sumlujing(node->right, targetSum, sumtmp);if(rf) return rf;return false;}bool hasPathSum(TreeNode* root, int targetSum) {if(root == nullptr) return false;return sumlujing(root, targetSum, 0);}
};
C++题解2(来源代码随想录):迭代法。用栈模拟递归,栈里一个元素不仅要记录该节点指针,还要记录从头结点到该节点的路径数值总和。采用pair结构来存放这个栈里的元素。
class Solution {
public:bool hasPathSum(TreeNode* root, int sum) {if (root == NULL) return false;// 此时栈里要放的是pair<节点指针,路径数值>stack<pair<TreeNode*, int>> st;st.push(pair<TreeNode*, int>(root, root->val));while (!st.empty()) {pair<TreeNode*, int> node = st.top();st.pop();// 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回trueif (!node.first->left && !node.first->right && sum == node.second) return true;// 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来if (node.first->right) {st.push(pair<TreeNode*, int>(node.first->right, node.second + node.first->right->val));}// 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来if (node.first->left) {st.push(pair<TreeNode*, int>(node.first->left, node.second + node.first->left->val));}}return false;}
};