递归求解 Leetcode112.路径总和(执行用时0ms)

220 阅读2分钟

虽然是个简单题,但是难得能够快速找到思路并顺利求解(hhh),所以写一下分享吧,作为力扣刷题新手,希望和大家交流。

题目描述:

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

示例:
给定如下二叉树,以及目标和 sum = 22,
              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

题解:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if(root == null)return false;
        boolean right = false;
        boolean left = false;
        sum -= root.val;
        if(root.left != null){left = hasPathSum(root.left, sum);}
        if(root.right != null){right = hasPathSum(root.right, sum);}
        if(sum==0 && root.left == null && root.right == null){return true;}
        return left || right;
    }
}

思路详解

1.确定迭代的方法

寻找路径总和涉及到树的遍历,所以首先想到使用递归或者迭代。因为hasPathSum(TreeNode root, int sum)方法同样适用于子树,所以就可以直接使用这个方法进行迭代。

2.确定迭代终止条件

终止迭代的条件题目描述里已经说得很清楚了“叶子节点AND求和值匹配”。叶子节点可以描述为root.left==null && root.right==null。求和值sum匹配则可以通过每找到一棵(子)树就用目标sum值减去当前这棵树的val的方法,如果sum==0就说明求和值匹配成功。综合起来,就是sum==0 && root.left == null && root.right == null

3.如何进行迭代

迭代无非就是在左右子树上继续调用hasPathSum方法,关键是这个方法的返回值该怎么定义。方法的返回值规定为boolean类型,表示符合迭代终止条件即返回true,因为每棵树都有左右两个子树,进而分为两个搜索路径,所以需要用两个boolean类型的变量保存这两个路径上的搜索结果,并将左右子树的搜索结果赋给这两个变量。

boolean right = false;
boolean left = false;
if(root.left != null){left = hasPathSum(root.left, sum);}
if(root.right != null){right = hasPathSum(root.right, sum);}

因为题目要求判断是否存在一条路径,那么就可以用“或”运算左右子树的搜索结果,作为当前树的搜索结果返回。 另外,作为迭代终止条件的叶子节点,因为不存在子树,所以可以直接返回true作为当前树的搜索结果返回。