Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions tree-bst/112.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
- [112. Path Sum](https://leetcode.com/problems/path-sum/description/)
- 方針
- コールスタック対策を考えると、BFS が適切だと思った
- が、別に再起でやってもQueueでやっても結局全探索なので時間計算量的には最悪O(N)で変わらない
- 再帰のコールスタックは今回の最悪データ量 5000 に耐えられない可能性があるので、再帰関数は採用しない
- Queueの場合
- 実装時間: 10分
- 時間計算量: O(N), 空間計算量: O(N)
- Stackの場合
- 実装時間: 5分 Queue とやっていることは全く同じ
- 時間計算量、空間計算量ともに Queue の場合と同じ

```java
/**
* 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;
}

Deque<NodeAndPrefixSum> nodes = new ArrayDeque<>();
nodes.addLast(new NodeAndPrefixSum(root, root.val));

while (!nodes.isEmpty()) {
NodeAndPrefixSum node = nodes.pollFirst();

if (node.treeNode.left != null) {
nodes.addLast(
new NodeAndPrefixSum(
node.treeNode.left,
node.prefixSum + node.treeNode.left.val
)
);
}

if (node.treeNode.right != null) {
nodes.addLast(
new NodeAndPrefixSum(
node.treeNode.right,
node.prefixSum + node.treeNode.right.val
)
);
}

if (node.treeNode.left == null
&& node.treeNode.right == null
&& node.prefixSum == targetSum) {
return true;
}
}

return false;
}

private record NodeAndPrefixSum(TreeNode treeNode, int prefixSum) {}
}
```


- Stack

```java
import java.util.ArrayDeque;

/**
* 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;
}

Deque<NodeAndPrefixSum> nodes = new ArrayDeque<>();
nodes.addLast(new NodeAndPrefixSum(root, root.val));
while (!nodes.isEmpty()) {
NodeAndPrefixSum node = nodes.pollLast();

if (node.treeNode.left != null) {
nodes.addLast(new NodeAndPrefixSum(
node.treeNode.left,
node.prefixSum + node.treeNode.left.val
));
}

if (node.treeNode.right != null) {
nodes.addLast(new NodeAndPrefixSum(
node.treeNode.right,
node.prefixSum + node.treeNode.right.val
));
}

if (node.treeNode.left == null
&& node.treeNode.right == null
&& node.prefixSum == targetSum) {
return true;
}
}
return false;
}

private record NodeAndPrefixSum(TreeNode treeNode, int prefixSum) {}
}
```