树与图必刷10题:遍历、搜索与高级结构

精选LeetCode树与图领域10道必刷题目:二叉树遍历、BST验证、最大路径和、Trie实现、岛屿数量等,详解递归思维与搜索框架。

树与图必刷 10 题

1. 二叉树的最大深度(LeetCode 104)

def max_depth(root):
    if not root:
        return 0
    return 1 + max(max_depth(root.left), max_depth(root.right))

2. 验证二叉搜索树(LeetCode 98)

def is_valid_bst(root):
    def helper(node, lower, upper):
        if not node:
            return True
        if node.val <= lower or node.val >= upper:
            return False
        return (helper(node.left, lower, node.val) and
                helper(node.right, node.val, upper))
    return helper(root, float('-inf'), float('inf'))

3. 二叉树中的最大路径和(LeetCode 124)

def max_path_sum(root):
    result = float('-inf')
    def helper(node):
        nonlocal result
        if not node:
            return 0
        left = max(helper(node.left), 0)
        right = max(helper(node.right), 0)
        result = max(result, left + right + node.val)
        return max(left, right) + node.val
    helper(root)
    return result

4. 二叉树的序列化与反序列化(LeetCode 297)

class Codec:
    def serialize(self, root):
        def helper(node):
            if not node:
                return ['#']
            return [str(node.val)] + helper(node.left) + helper(node.right)
        return ','.join(helper(root))

    def deserialize(self, data):
        vals = iter(data.split(','))
        def helper():
            val = next(vals)
            if val == '#':
                return None
            node = TreeNode(int(val))
            node.left = helper()
            node.right = helper()
            return node
        return helper()

5. 实现 Trie(LeetCode 208)

见 哈希表文章。

6. 课程表(LeetCode 207)— 拓扑排序

from collections import deque, defaultdict

def can_finish(num_courses, prerequisites):
    graph = defaultdict(list)
    indegree = [0] * num_courses
    for a, b in prerequisites:
        graph[b].append(a)
        indegree[a] += 1
    queue = deque([i for i in range(num_courses) if indegree[i] == 0])
    count = 0
    while queue:
        course = queue.popleft()
        count += 1
        for next_course in graph[course]:
            indegree[next_course] -= 1
            if indegree[next_course] == 0:
                queue.append(next_course)
    return count == num_courses

7. 岛屿数量(LeetCode 200)

见 搜索算法文章。

8. 克隆图(LeetCode 133)

from collections import deque

class Node:
    def __init__(self, val=0, neighbors=None):
        self.val = val
        self.neighbors = neighbors if neighbors else []

def clone_graph(node):
    if not node:
        return None
    visited = {}
    queue = deque([node])
    visited[node] = Node(node.val)
    while queue:
        curr = queue.popleft()
        for neighbor in curr.neighbors:
            if neighbor not in visited:
                visited[neighbor] = Node(neighbor.val)
                queue.append(neighbor)
            visited[curr].neighbors.append(visited[neighbor])
    return visited[node]

9. 找到小镇的法官(LeetCode 997)— 出入度

def find_judge(n, trust):
    indegree = [0] * (n + 1)
    outdegree = [0] * (n + 1)
    for a, b in trust:
        outdegree[a] += 1
        indegree[b] += 1
    for i in range(1, n + 1):
        if indegree[i] == n - 1 and outdegree[i] == 0:
            return i
    return -1

10. 太平洋大西洋水流问题(LeetCode 417)

def pacific_atlantic(heights):
    if not heights:
        return []
    rows, cols = len(heights), len(heights[0])
    pacific = [[False] * cols for _ in range(rows)]
    atlantic = [[False] * cols for _ in range(rows)]

    def dfs(r, c, visited, prev_height):
        if (r < 0 or r >= rows or c < 0 or c >= cols or
            visited[r][c] or heights[r][c] < prev_height):
            return
        visited[r][c] = True
        for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
            dfs(r + dr, c + dc, visited, heights[r][c])

    for i in range(rows):
        dfs(i, 0, pacific, 0)
        dfs(i, cols - 1, atlantic, 0)
    for j in range(cols):
        dfs(0, j, pacific, 0)
        dfs(rows - 1, j, atlantic, 0)

    result = []
    for i in range(rows):
        for j in range(cols):
            if pacific[i][j] and atlantic[i][j]:
                result.append([i, j])
    return result

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页