返回

理解LeetCode 1740:Python 中二叉树距离查找算法

后端

踏入算法的殿堂,我们今天将深入探讨LeetCode 1740:在二叉树中查找距离。本文将深入剖析这一经典问题,指导你使用Python代码巧妙地解决它。

问题

给定一棵二叉树的根节点root、两个节点pq,求解pq之间的距离。

解题思路

我们采用深度优先搜索(DFS)算法,从root节点开始,递归地探索二叉树。在每次递归调用中,我们检查当前节点是否是pq,如果是,则记录其深度。

如果当前节点既不是p也不是q,则我们继续递归探索其左子树和右子树。如果在左子树或右子树中找到了pq,则我们更新其深度并将其传递给父节点。

当我们遍历完整个二叉树后,pq的深度差就是它们之间的距离。

def findDistance(root, p, q):
    # 返回节点 `node` 到节点 `p``q` 的距离和
    def dfs(node):
        if not node:
            return [-1, -1, 0]

        left = dfs(node.left)
        right = dfs(node.right)

        # 如果当前节点是 `p``q`
        if node.val == p.val:
            return [node.val, -1, 1]
        elif node.val == q.val:
            return [-1, node.val, 1]

        # 如果 `p``q` 在左子树或右子树中找到
        if left[0] != -1:
            return [left[0], left[1], left[2] + 1]
        elif left[1] != -1:
            return [-1, left[1], left[2] + 1]
        elif right[0] != -1:
            return [right[0], right[1], right[2] + 1]
        elif right[1] != -1:
            return [-1, right[1], right[2] + 1]

        return [-1, -1, 0]

    # 调用 `dfs` 函数,并返回 `p``q` 的距离
    distance = dfs(root)[2]
    return distance if distance != 0 else -1

结语

借助DFS算法的强大威力,我们成功地解决了LeetCode 1740:在二叉树中查找距离。掌握这项技术,你将拥有在算法领域更上一层楼的利器。