BM29 题解 | #二叉树中和为某一值的路径(一)#

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

https://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c

解题前困惑:

题目是要找出是否有某一路径和为sum,但是,很多情况都有可能返回false(比如遍历到叶子节点的空节点,遍历到叶子节点路径也不为目标sum等等),怎么就通过 判断(sum - root.val ==0), 的递归过程,返回true的?

阿哈时刻:

关键是前序遍历的过程中,解决了如下几个问题,扫除了我上面的困惑。

1、某一条路径的叶子节点,或者叶子节点的空节点,返回false都没有关系,应该return 的时候是 "||" 运算,只要左右子树有一边有就可以!

2、在visit T的时候,通过判断 root.left == null && root.right == null 来定位到子节点

解题思路:

1、使用前序遍历的方法, if(visitT)返回值 / if(左节点) || if(右节点) 返回值。

2、visitT的时候,通过判断 root.left == null && root.right == null 来定位到子节点

3、 if(左节点) || if(右节点) 返回值,使用 || 或运算符,就可以把可能的路径找出来!

解题思路:

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 这道题就是前序遍历的一种变种
     * 思路:遍历
     * @param root TreeNode类
     * @param sum int整型
     * @return bool布尔型
     */
    //疑惑,递归该如何判断,前值遍历如何判断?
    // root == null 有可能传入就为空,还有就是到叶子节点的情况,如何区别?
    // 如何处理 左右自己节点的递归判断,sum - root.val 是怎么做到这样的判断的
    // 啊哈时刻:关键在于 || 运算符,只有一条分支有,就可以,其他都是false都没关系
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return false;
        }

        if (root.left == null && root.right == null && sum - root.val == 0) {
            return true;
        }

        return hasPathSum(root.left, sum - root.val) ||
               hasPathSum(root.right, sum - root.val);
    }

    /**
     * 使用记录路径来实现的功能
     */
    public boolean hasPathSum2 (TreeNode root, int sum) {
        if (root == null) {
            return false;
        }
        if (root.left == null && root.right == null && root.val == sum) {
            return true;
        }
        ArrayList<Integer> res = new ArrayList<Integer>();
        dfs(root, sum, res);
        return isFound;
    }

    boolean isFound = false;

    void dfs(TreeNode root, int sum, ArrayList<Integer> res) {
        // 到底了,判断res值是否为sum?
        if (root == null) {
            int path = 0;
            for (int i = 0; i < res.size(); i++) {
                path += res.get(i);
            }
            if (sum == path && res.size() > 1) {
                isFound = true;
            }
            return;
        }

        if (isFound) {
            return;
        }

        res.add(root.val);
        dfs(root.left, sum, res);
        dfs(root.right, sum, res);

        if (isFound) {
            return;
        }

        res.remove(res.size() - 1);
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务