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);
}
}
查看9道真题和解析