描述
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
例如:
给出如下的二叉树,sum=22,
返回true,因为存在一条路径 5→4→11→2的节点值之和为 22
数据范围:
1.树上的节点数满足 0≤n≤10000
2.每 个节点的值都满足 ∣val∣≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(树的高度),时间复杂度 O(n)
示例1
输入:{5,4,8,1,11,#,9,#,#,2,7},22
返回值:true
示例2
输入:{1,2},0
返回值:false
示例3
输入:{1,2},3
返回值:true
示例4
输入:{},0
返回值:false
牛客
递归法:根节点加入到左右节点中,然后再判断。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
public boolean hasPathSum (TreeNode root, int sum) {
// write code here
if(root == null)return false;
if(root.left==null && root.right == null && sum == root.val) return true;
if(root.left != null) root.left.val += root.val;
if(root.right!=null) root.right.val += root.val;
return hasPathSum(root.left,sum) || hasPathSum(root.right,sum);
}
}
层次遍历的方法
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
public boolean hasPathSum (TreeNode root, int sum) {
// write code here
if(root == null)return false;
Queue<TreeNode> q1 = new LinkedList<>();
q1.offer(root);
while(!q1.isEmpty()){
TreeNode node = q1.poll();
if(node.left == null && node.right == null && node.val == sum) return true;
if(node.left != null) {node.left.val += node.val;q1.offer(node.left);}
if(node.right != null) {node.right.val += node.val;q1.offer(node.right);}
}
return false;
}
}
栈的方法:双栈