@Leetcode路径总和
当经历过这么数个树类型的题目时,拿到这道题目,你心中是否已经有一个想法了呢?没错,小白笔者的确有一个想法,虽然认真写了一会之后就觉得这个想法不靠谱哈哈。废话少说,请看题干:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
没错,笔者第一个想法就是,我们挨个加吧!从根结点到叶子结点的所有通路全部都尝试一边,只要能够满足与所给的sum相等就说明存在这个通路。于是当时笔者就撸起袖子开始创建vector准备存树的数据然后深搜挨个判断,可是写了一会,另一个更加简单的思路就来了(感谢某位笔者的朋友提醒):为什么不能从sum上面做文章呢?这提醒了笔者可以通关判断sum减去当前结点的值是否还能与下一结点的判断成功来确定是否可以完成整个算法,递归的尽头是叶子结点和一点点减到还剩最后一点的sum,判断是否方便。请看代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL)
return false;
if(root->left==NULL&&root->right==NULL&&root->val==sum)
return true;
if(root!=NULL){
if(root->left!=NULL)
if(hasPathSum(root->left,sum-root->val))
return true;
if(root->right!=NULL)
if(hasPathSum(root->right,sum-root->val))
return true;
}
return false;
}
};
说干就干,笔者用最简单最笨的讨论写了一份代码,没想到居然可以顺利通过,有时候还是这种反向思维能够帮助我们确定一些问题的解,当你想要玩树的时候,不妨想一想,玩一玩另一个参数,有时也的确是那么回事。
总的来说,思路明了:从根节点开始,每当遇到一个节点的时候,从目标值里扣除节点值,一直到叶子节点判断目标值是不是被扣完。
方法上,除了递归,还有一种是迭代法,也就是大家所熟知的深度优先搜索,通过构造栈结构存储已经判断过的结点和val值的总和并判断与目标值是否相等。笔者太菜,代码不精,等到哪天水平到了,能够灵活运用栈结构了,再拙笔一篇代码呈上。