Week 02 - Binary Trees & Graphs

Reference extracted from the detailed guide.

Day 1-3: Binary Trees

Watch First (CRITICAL):

Problems in Order:

#LeetCodeProblem NameDifficultyPatternVideo Solution
1LC #226Invert Binary TreeEasyDFS Recursivehttps://www.youtube.com/watch?v=OnSn2XEQ4MY
2LC #104Maximum Depth of Binary TreeEasyDFShttps://www.youtube.com/watch?v=hTM3phVI6YQ
3LC #100Same TreeEasyDFS Comparehttps://www.youtube.com/watch?v=vRbbcKXCxOw
4LC #572Subtree of Another TreeEasyDFS + Same Treehttps://www.youtube.com/watch?v=E36O5SWp-LE
5LC #102Binary Tree Level Order TraversalMediumBFShttps://www.youtube.com/watch?v=6ZnyEApgFYg
6LC #199Binary Tree Right Side ViewMediumBFShttps://www.youtube.com/watch?v=d4zLyf32e3I
7LC #98Validate Binary Search TreeMediumDFS + Rangehttps://www.youtube.com/watch?v=s6ATEkipzow
8LC #230Kth Smallest Element in BSTMediumInorderhttps://www.youtube.com/watch?v=5LUXSvjmGCw
9LC #235Lowest Common Ancestor of BSTMediumBST Propertyhttps://www.youtube.com/watch?v=gs2LMfuOR9k
10LC #236Lowest Common Ancestor of BTMediumDFShttps://www.youtube.com/watch?v=py3R23aAPCA
11LC #297Serialize and Deserialize BTHardBFS/DFShttps://www.youtube.com/watch?v=u4JAi2JJhI8
12LC #124Binary Tree Maximum Path SumHardDFS + Global Maxhttps://www.youtube.com/watch?v=Hr5cWUld4vU

Key Templates:

# Template: DFS Recursive
def dfs(node):
    if not node:
        return base_case
    left = dfs(node.left)
    right = dfs(node.right)
    return combine(left, right, node.val)

# Template: BFS Level Order
from collections import deque
def bfs(root):
    if not root:
        return []
    queue = deque([root])
    result = []
    while queue:
        level_size = len(queue)
        level = []
        for _ in range(level_size):
            node = queue.popleft()
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        result.append(level)
    return result

# Template: Validate BST
def isValidBST(root, min_val=float('-inf'), max_val=float('inf')):
    if not root:
        return True
    if not (min_val < root.val < max_val):
        return False
    return (isValidBST(root.left, min_val, root.val) and 
            isValidBST(root.right, root.val, max_val))

Day 4-6: Graphs BFS/DFS

Watch First (CRITICAL):

Problems in Order:

#LeetCodeProblem NameDifficultyPatternVideo Solution
1LC #200Number of IslandsMediumDFS/BFS Gridhttps://www.youtube.com/watch?v=pV2kpPD66nE
2LC #695Max Area of IslandMediumDFS Gridhttps://www.youtube.com/watch?v=iJGr1OtmH0c
3LC #133Clone GraphMediumDFS + HashMaphttps://www.youtube.com/watch?v=mQeF6bN8hMk
4LC #417Pacific Atlantic Water FlowMediumMulti-source DFShttps://www.youtube.com/watch?v=s-VkcjHqkGI
5LC #207Course ScheduleMediumTopological Sorthttps://www.youtube.com/watch?v=EgI5nU9etnU
6LC #210Course Schedule IIMediumTopological Sorthttps://www.youtube.com/watch?v=Akt3glAwyfY
7LC #994Rotting OrangesMediumMulti-source BFShttps://www.youtube.com/watch?v=y704fEOx0s0
8LC #286Walls and GatesMediumMulti-source BFShttps://www.youtube.com/watch?v=e69C6xhiSQE

Key Templates:

# Template: DFS on Grid
def numIslands(grid):
    def dfs(i, j):
        if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]):
            return
        if grid[i][j] != '1':
            return
        grid[i][j] = '#'  # mark visited
        dfs(i+1, j)
        dfs(i-1, j)
        dfs(i, j+1)
        dfs(i, j-1)
    
    count = 0
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == '1':
                dfs(i, j)
                count += 1
    return count

# Template: Topological Sort (DFS)
def canFinish(numCourses, prerequisites):
    graph = defaultdict(list)
    for crs, pre in prerequisites:
        graph[crs].append(pre)
    
    UNVISITED, VISITING, VISITED = 0, 1, 2
    states = [UNVISITED] * numCourses
    
    def dfs(crs):
        if states[crs] == VISITING:
            return False  # cycle detected
        if states[crs] == VISITED:
            return True
        
        states[crs] = VISITING
        for pre in graph[crs]:
            if not dfs(pre):
                return False
        states[crs] = VISITED
        return True
    
    return all(dfs(crs) for crs in range(numCourses))

# Template: BFS on Grid
from collections import deque
def bfs_grid(grid, start_i, start_j):
    queue = deque([(start_i, start_j, 0)])  # (row, col, distance)
    visited = {(start_i, start_j)}
    directions = [(0,1), (0,-1), (1,0), (-1,0)]
    
    while queue:
        i, j, dist = queue.popleft()
        for di, dj in directions:
            ni, nj = i + di, j + dj
            if 0 <= ni < len(grid) and 0 <= nj < len(grid[0]):
                if (ni, nj) not in visited and grid[ni][nj] != '#':
                    visited.add((ni, nj))
                    queue.append((ni, nj, dist + 1))

Day 7: Review + LeetCode Weekly Contest


Comments

Share your approach or ask questions

0 comments
?
|
Markdown supported
Sign in to post

Loading comments...