LeetCode 112. 路径总和(C++实现)

一、题目描述

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例: 
给定如下二叉树,以及目标和 sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1


返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

 

二、思路

方法一:DFS递归

最直接的方法就是利用递归,遍历整棵树:如果当前节点不是叶子,对它的所有孩子节点,递归调用 hasPathSum 函数,其中 sum 值减去当前节点的权值;如果当前节点是叶子,检查 sum 值是否为 0,也就是是否找到了给定的目标和。

 

 

方法二:DFS迭代

其实和递归的思路一样,只不过递归是系统维护空间,而这里是自己维护栈空间。需要自定义一个栈,保存当前结点以及当前的sum。我们可以用栈将递归转成迭代的形式。深度优先搜索在除了最坏情况下都比广度优先搜索更快。

本题采用的是先序遍历的方法,进行迭代

 

三、实现

DFS递归:

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(root == NULL) return false;
        sum -= root->val;
        if((root->left == NULL) && (root->right == NULL)) return (sum == 0);
        return hasPathSum(root->left,sum) || hasPathSum(root->right,sum);
    }
};

 

DFS迭代:

//利用先序遍历进行DFS的迭代
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(root == NULL) return false;
        stack> s;
        s.push(make_pair(root,sum));
        TreeNode* node = root;
        int currSum;
        while(!s.empty()){
            node = s.top().first;
            currSum = s.top().second;
            s.pop();
            if(node->left == NULL && node->right == NULL && node->val == currSum) 
                return true;
            if(node->right) s.push(make_pair(node->right,currSum - node->val));
            if(node->left) s.push(make_pair(node->left,currSum - node->val));
        }
        return false;
    }
};

 

你可能感兴趣的:(算法刷题)