上一次写了哥所有路径,这一次就用到它了,让你判断二叉树路径中是否有和等于指定目标的。
(22条消息) 左叶子之和、二叉树的所有路径。_小肖在路上的博客-CSDN博客
存入list中判断就好了,比较容易理解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null){
return false;
}
dfs(root, targetSum);
return f;
}
boolean f = false;
ArrayList<Integer> ans = new ArrayList<>();
private void dfs(TreeNode root, int targetSum) {
if (root.left == null && root.right == null) {
ans.add(root.val);
if (!f) {
chak(ans, targetSum);
}
ans.remove(ans.size() - 1);
return;
}
ans.add(root.val);
if (root.left != null) {
dfs(root.left, targetSum);
}
if (root.right != null) {
dfs(root.right, targetSum);
}
ans.remove(ans.size() - 1);
}
private void chak(ArrayList<Integer> arrayList, int k) {
int sum = 0;
for (Integer i : arrayList) {
sum += i;
}
if (sum == k) {
f = true;
}
}
}
下面加高一下难度,要求输出二叉树中所有满足的子树:
这个也还好,我们将每一个子树进行检测一满足就加入集合中:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
if(root==null){
return list;
}
dfs(root, targetSum);
return list;
}
List<List<Integer>> list = new ArrayList<>();
List<Integer> ans = new ArrayList<>();
private void dfs(TreeNode root, int targetSum) {
if (root.left == null && root.right == null) {
ans.add(root.val);
if (chak(ans, targetSum)) {
list.add(new ArrayList<>(ans));
}
ans.remove(ans.size() - 1);
return;
}
ans.add(root.val);
if (root.left != null) {
dfs(root.left, targetSum);
}
if (root.right != null) {
dfs(root.right, targetSum);
}
ans.remove(ans.size() - 1);
}
private boolean chak(List<Integer> arrayList, int k) {
int sum = 0;
for (Integer i : arrayList) {
sum += i;
}
return sum == k;
}
}
这里要注意的是,不能直接将ans加入到list中,因为我在后面进行了删除操作,也就是回,由于list是引用数据类型,会影响到list里的数据,这里的原因是浅复制和深复制,大家要去执行学习一下