leetcode 112. Path Sum


  1. Path Sum:题目链接

DFS-递归

首先子问题 看左子树是否包含从root到叶子结点和为sum的路径 hasPathSum(root.left, sum - root.val),再看右子树是否包含hasPathSum(root.right, sum - root.val); 只要左子树或右子树一个包含说明有这样的路径,递归结束的条件有两个 root == null 树空 ,root.left ==null && root.right == null 返回 root.val == sum是叶子结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
// 递归宏观语义:返回以root为根节点的二叉树,从根节点到叶子结点 其和为sum的路径是否存在
// 时间复杂度O(N) 空间复杂度O(N) 递归栈的大小
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) {
return false;
}
if (root.left == null && root.right == null) { // 递归到叶子结点 看剩下的sum是否等于叶子结点的值
return root.val == sum;
}
// 去左子树找是否存在这样的路径并更新sum的值 去右子树找是否存在这样的路径并更新sum的值 只有左右子树有一个找到了 就返回true
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}
}

BFS

原理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
// BFS 时间复杂度O(N) 空间复杂度O(M):队列大小
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) { // 树空
return false;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode front = queue.poll();
if (front.left == null && front.right == null) { // 遍历到叶节点
if (front.val == sum) { // 只有当从根节点到该叶节点路径上的和累加起来 == sum
return true;
}
}
if (front.left != null) { // 左子树不空 左孩子入队 并将父亲结点的值累加到左孩子结点
front.left.val += front.val;
queue.offer(front.left);
}
if (front.right != null) { // 右子树不空 右孩子入队 并将父亲结点的值累加到右孩子结点
front.right.val += front.val;
queue.offer(front.right);
}
}
return false;
}
}
文章目录
  1. 1. DFS-递归
  2. 2. BFS
|