112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
class Solution {
private:
bool dfs_find(TreeNode* cur,int sum,int targetSum)
{
if(cur->left==nullptr&&cur->right==nullptr)
{
if(sum == targetSum) return true;
else return false;
}
bool l,r;
l = r = false;
if(cur->left) l = dfs_find(cur->left,sum + cur->left->val,targetSum);
if(cur->right) r = dfs_find(cur->right,sum + cur->right->val,targetSum);
return l|r;
}
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return false;
bool res = dfs_find(root,root->val,targetSum);
return res;
}
bool haspathsum1(TreeNode* root, int sum) {
if (root == nullptr) return false;
// 此时栈里要放的是pair<节点指针,路径数值>
stack<std::pair<TreeNode*, int>> st;
st.push(std::pair<TreeNode*, int>(root, root->val));
while (!st.empty()) {
std::pair<TreeNode*, int> node = st.top();
st.pop();
// 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true
if (!node.first->left && !node.first->right && sum == node.second) return true;
// 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来
if (node.first->right) {
st.push(std::pair<TreeNode*, int>(node.first->right, node.second + node.first->right->val));
}
// 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来
if (node.first->left) {
st.push(std::pair<TreeNode*, int>(node.first->left, node.second + node.first->left->val));
}
}
return false;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理