JZ82 二叉树中和为某一值的路径(一)

二叉树递归

复制代码
/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 *    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */
    bool hasPathSum(TreeNode* root, int sum) {
        // write code here
        
     // 此判断用到的时机有两个:
     // 一个是判断根节点是否为空
     // 还有就是当遍历子叶后,如果没有返回true,就返回false
     if(root == nullptr) return false; if(root->left == nullptr && root->right == nullptr && root->val == sum) return true; return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val); } };
复制代码

 

dfs+栈

复制代码
/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 *    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */
    bool hasPathSum(TreeNode* root, int sum) {
        // write code here
        if(root == nullptr) return false;
        // 栈辅助深度优先遍历,并记录到相应节点的路径和
        stack<pair<TreeNode*, int>> s;
        // 根节点入栈
        s.push({root, root->val});

        while(!s.empty()){
            auto tmp = s.top();
            s.pop();
            // 叶子节点且路径和等于sum
            if(tmp.first->left == nullptr && tmp.first->right == nullptr && tmp.second == sum) return true;
            // 左节点入栈
            if(tmp.first->left != nullptr) {
                s.push({tmp.first->left, tmp.second + tmp.first->left->val});
            }
            // 右节点入栈
            if(tmp.first->right != nullptr) {
                s.push({tmp.first->right, tmp.second + tmp.first->right->val});
            }
        }
        return false;
    }
};
复制代码

 

posted @   luxiayuai  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示