返回

树形结构——对应算法详解二

前端

树形结构——对应算法详解二

树形结构在算法和数据结构中扮演着至关重要的角色,其层次化的组织方式使其成为表示复杂数据的理想选择。为了加深对树的理解并掌握相关算法,本文将深入探讨五道经典的 LeetCode 树形结构算法题,提供详细的题解和实现方法。

1. 监控二叉树(LeetCode 968)

问题

给定一棵二叉树,其中每个节点的值表示该节点覆盖的监控范围,找出放置监控摄像头以覆盖最多节点的最少摄像头数量。

思路:

  • 对于每个节点,有三种放置摄像头的情况:
    • 在该节点上放置摄像头,覆盖其子节点和自身。
    • 在该节点的父节点上放置摄像头,覆盖该节点和父节点。
    • 不在该节点或其父节点上放置摄像头。
  • 递归地遍历二叉树,记录每种放置情况下的最小摄像头数量。
  • 返回满足条件的最小摄像头数量。

代码示例:

def minCameraCover(root):
    def dfs(node):
        if not node:
            return 0, 0, float('inf')

        left_no, left_one, left_two = dfs(node.left)
        right_no, right_one, right_two = dfs(node.right)

        no_cam = min(left_one, left_two) + min(right_one, right_two)
        one_cam = 1 + min(left_no, left_two) + min(right_no, right_two)
        two_cam = min(left_one, left_no) + min(right_one, right_no)

        return no_cam, one_cam, two_cam

    return min(dfs(root)[1:])

2. 二叉树最大宽度(LeetCode 662)

问题:

给定一棵二叉树,找出其最大宽度。二叉树的宽度定义为其最宽一层上的节点数。

思路:

  • 使用队列进行广度优先遍历。
  • 在每层遍历过程中,记录该层节点的数量。
  • 更新最大宽度。

代码示例:

def maxWidthOfBinaryTree(root):
    if not root:
        return 0

    max_width = 0
    queue = [(root, 1)]

    while queue:
        width = len(queue)
        max_width = max(max_width, width)

        for _ in range(width):
            node, idx = queue.pop(0)
            if node.left:
                queue.append((node.left, idx * 2))
            if node.right:
                queue.append((node.right, idx * 2 + 1))

    return max_width

3. 二叉树的前序遍历(LeetCode 144)

问题:

给定一棵二叉树,返回其前序遍历结果。

思路:

  • 使用栈进行深度优先遍历。
  • 将根节点压入栈中。
  • 当栈不为空时,弹出栈顶元素并访问该节点。
  • 将该节点的右子节点和左子节点依次压入栈中。

代码示例:

def preorderTraversal(root):
    if not root:
        return []

    stack = [root]
    result = []

    while stack:
        node = stack.pop()
        result.append(node.val)
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)

    return result

4. N 叉树的最大深度(LeetCode 589)

问题描述:

给定一棵 N 叉树,找出其最大深度。N 叉树的深度定义为从根节点到最深叶节点的最长路径上的节点数。

思路:

  • 对于每个节点,递归地求出其子节点的最大深度。
  • 取所有子节点最大深度中的最大值,加上 1(根节点)。

代码示例:

def maxDepth(root):
    if not root:
        return 0

    max_depth = 0
    for child in root.children:
        max_depth = max(max_depth, maxDepth(child))

    return max_depth + 1

结语

通过对这五道树形结构算法题的深入探讨,我们加深了对树形结构及其相关算法的理解。掌握这些算法不仅能让我们轻松应对算法面试,更重要的是,它们为我们解决现实世界中的复杂数据结构问题提供了强大的工具。未来,我们将继续探索更高级的树形结构算法,进一步提升我们的算法思维和编程能力。