From 3c69335baebf856a18bae7dd631979be88537d42 Mon Sep 17 00:00:00 2001 From: nikhylw <1.nikhil.wani+nikhly@gmail.com> Date: Sat, 9 May 2026 01:24:23 +0530 Subject: [PATCH] adding bfs-1 solns --- W5_1_level_order_traversal.py | 42 +++++++++++++++++++++++++++ W5_3_course_schedule.py | 54 +++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 W5_1_level_order_traversal.py create mode 100644 W5_3_course_schedule.py diff --git a/W5_1_level_order_traversal.py b/W5_1_level_order_traversal.py new file mode 100644 index 00000000..879df1ed --- /dev/null +++ b/W5_1_level_order_traversal.py @@ -0,0 +1,42 @@ +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, val=0, left=None, right=None): +# self.val = val +# self.left = left +# self.right = right + +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: + + # Self-note: Do not declare a list, pop(0) in python is O(N) + q = deque() + results = [] + + if root is None: + return [] + + q.append(root) + + while q: + + level = [] + size = len(q) + for i in range(0, size): + + # do not use pop(0) with a list, O(n) time in python! + curr = q.popleft() + level.append(curr.val) + + if curr.left: + q.append(curr.left) + + if curr.right: + q.append(curr.right) + + results.append(level) + + + return results + +# Time complexity: O(n), we visist all the nodes once. +# Space complexity: O(n/4) = O(n), the leaf nodes (for a balance binary tree) \ No newline at end of file diff --git a/W5_3_course_schedule.py b/W5_3_course_schedule.py new file mode 100644 index 00000000..df5fcca3 --- /dev/null +++ b/W5_3_course_schedule.py @@ -0,0 +1,54 @@ +class Solution: + def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: + + # Maintain a list + indegrees = [0] * numCourses + + # Maintain a hashmap + outdegree_graph = {} + + # We initialize the indegree by going over prerequisities and outdegrees by using a hashmap + for pre in prerequisites: + indegrees[pre[0]] = indegrees[pre[0]] + 1 + + if pre[1] not in outdegree_graph: + outdegree_graph[pre[1]] = [] + + outdegree_graph[pre[1]].append(pre[0]) + + q = deque() + count = 0 + + for i in range(0, numCourses): + if indegrees[i] == 0: + q.append(i) + count = count + 1 + + if count == numCourses: + return True + + # if Queue is empty + if not q: + return False + + while q: + curr = q.popleft() + + # self-note: Do not use outdegree_graph.get[curr] + dependencies = outdegree_graph.get(curr) + + if dependencies: + for dep in dependencies: + indegrees[dep] = indegrees[dep] - 1 + if indegrees[dep] == 0: + q.append(dep) + count = count + 1 + + if count == numCourses: + return True + + return False + +# time complexity: O(v + e) +# space complexity: O(v + e) +