返回

逐一击破,步步为“赢”!《二叉树中所有距离为K的结点》巧解之法

前端







## 算法概述:

本题的关键在于寻找距离目标结点为K的结点,可以使用深度搜索或广度搜索来实现。

1. 深度搜索:

   - 从目标结点开始,深度优先搜索整棵树。
   - 对于每个结点,记录其与目标结点的距离。
   - 如果距离等于K,则将该结点添加到结果列表中。

2. 广度搜索:

   - 从目标结点开始,广度优先搜索整棵树。
   - 对于每个结点,记录其与目标结点的距离。
   - 如果距离等于K,则将该结点添加到结果列表中。

## 深度搜索算法实现:

```python
def distanceK(root, target, K):
    """
    :type root: TreeNode
    :type target: TreeNode
    :type K: int
    :rtype: List[int]
    """

    # 找到目标结点
    target_node = find_target(root, target)

    # 深度搜索从目标结点开始
    result = []
    dfs(target_node, K, result)
    return result


def find_target(root, target):
    """
    找到目标结点
    """
    if root is None:
        return None

    if root.val == target:
        return root

    left = find_target(root.left, target)
    right = find_target(root.right, target)

    return left or right


def dfs(node, K, result):
    """
    深度搜索从目标结点开始
    """
    if node is None:
        return

    # 如果距离等于K,则将该结点添加到结果列表中
    if K == 0:
        result.append(node.val)
        return

    # 继续搜索子树
    dfs(node.left, K - 1, result)
    dfs(node.right, K - 1, result)

广度搜索算法实现:

def distanceK(root, target, K):
    """
    :type root: TreeNode
    :type target: TreeNode
    :type K: int
    :rtype: List[int]
    """

    # 找到目标结点
    target_node = find_target(root, target)

    # 广度搜索从目标结点开始
    result = []
    queue = [(target_node, 0)]
    visited = set()

    while queue:
        node, distance = queue.pop(0)

        # 如果距离等于K,则将该结点添加到结果列表中
        if distance == K:
            result.append(node.val)
            continue

        # 如果结点没有被访问过
        if node not in visited:
            visited.add(node)

            # 将相邻的结点添加到队列中
            if node.left is not None:
                queue.append((node.left, distance + 1))
            if node.right is not None:
                queue.append((node.right, distance + 1))
            if node.parent is not None:
                queue.append((node.parent, distance + 1))

    return result


def find_target(root, target):
    """
    找到目标结点
    """
    if root is None:
        return None

    if root.val == target:
        return root

    left = find_target(root.left, target)
    right = find_target(root.right, target)

    return left or right

算法分析:

  • 时间复杂度:

    • 深度搜索算法的时间复杂度为O(N),其中N是二叉树中的结点数。
    • 广度搜索算法的时间复杂度为O(N),其中N是二叉树中的结点数。
  • 空间复杂度:

    • 深度搜索算法的空间复杂度为O(N),其中N是二叉树中的结点数。
    • 广度搜索算法的空间复杂度为O(N),其中N是二叉树中的结点数。

不同方法的比较:

方法 时间复杂度 空间复杂度 优缺点
深度搜索 O(N) O(N) 容易实现,但效率较低
广度搜索 O(N) O(N) 效率较高,但实现难度较大

总结:

本文介绍了如何使用深度搜索和广度搜索两种算法来解决 LeetCode 上的 863. 二叉树中所有距离为 K 的结点问题。还讨论了不同方法的优缺点,以及如何选择最适合自己的方法。希望本文对您有所帮助。