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 @ 2023-07-01 17:04  luxiayuai  阅读(18)  评论(0)    收藏  举报