题目描述:
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:
Given the below binary tree and sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.
递归解法
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) return false;
if (root.left == null && root.right == null) return sum == root.val;
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}
BFS
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) return false;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
Queue<Integer> value = new LinkedList<Integer>();
queue.offer(root); value.offer(root.val);
while(!queue.isEmpty()){
int levelNum = queue.size();
for (int i = 0; i < levelNum; i++){
//TreeNode node = queue.peek(); int val = value.peek();
// if (queue.peek().left == null && queue.peek().right == null){
// if (value.peek() == sum) {System.out.println(value.peek()); return true;}
// }
TreeNode node = queue.peek(); int val = value.peek();
if (node.left == null && node.right == null && val == sum) return true;
if (node.left != null) {
value.offer(value.peek() + queue.peek().left.val);
queue.offer(queue.peek().left);
}
if (queue.peek().right != null) {
value.offer(value.peek() + queue.peek().right.val);
queue.offer(queue.peek().right);
}
queue.poll();
value.poll();
}
}
return false;
}
DFS
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) return false;
//if (root.val == sum) return true;
Stack<TreeNode> stack = new Stack<>();
Stack<Integer> value = new Stack<>();
stack.push(root);value.push(root.val);
while (!stack.isEmpty()){
TreeNode node = stack.pop(); Integer val = value.pop();
if (node.left == null && node.right == null && val == sum) return true;
if (node.left != null) {
stack.push(node.left); value.push(val+ node.left.val);
}
if (node.right != null) {
stack.push(node.right); value.push(val+ node.right.val);
}
//if (stack.peek().left != null && stack.peek().right != null) stack.pop();
}
return false;
}