📌  相关文章
📜  为 Q 查询查找给定二叉树中两个节点之间的距离(1)

📅  最后修改于: 2023-12-03 15:21:35.486000             🧑  作者: Mango

为 Q 查询查找给定二叉树中两个节点之间的距离

在二叉树中查找两个节点之间的距离是一个经典的问题。在本篇文章中,我们将讨论如何使用深度优先搜索(DFS)和广度优先搜索(BFS)算法来解决这个问题。

问题描述

给定一个二叉树和其中的两个节点,请找出它们之间的距离。距离定义为从一个节点到另一个节点需要经过的边的数量。假设二叉树中不存在重复的节点。

解法一:深度优先搜索

深度优先搜索算法可以帮助我们计算两个节点之间的距离。我们可以通过递归的方式从根节点开始搜索二叉树,查找包含两个节点的最小子树。当我们找到两个节点分别在左右子树中时,我们可以计算出它们之间的距离。

下面是使用深度优先搜索算法解决问题的代码片段:

class Solution:
    def __init__(self):
        self.ans = 0

    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        """
        计算二叉树中两个节点的距离
        """
        self.dfs(root, p, q)
        return self.ans

    def dfs(self, node: TreeNode, p: TreeNode, q: TreeNode):
        """
        深度优先搜索算法
        """
        if not node:
            return 0

        left = self.dfs(node.left, p, q)
        right = self.dfs(node.right, p, q)

        if left and right:
            self.ans = left + right
        elif (left or right) and (node.val == p.val or node.val == q.val):
            self.ans = left + right + 1
        elif node.val == p.val or node.val == q.val:
            return 1
        else:
            return left + right
解法二:广度优先搜索

广度优先搜索算法也可以解决这个问题。我们可以使用一个队列来遍历整个二叉树,并计算两个节点之间的距离。当我们找到两个节点时,我们可以计算它们之间的距离。

下面是使用广度优先搜索算法解决问题的代码片段:

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        """
        计算二叉树中两个节点的距离
        """
        if not root:
            return 0

        queue = [(root, 0)]
        p_level = q_level = -1

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

            if node.val == p.val:
                p_level = level
            elif node.val == q.val:
                q_level = level

            if node.left:
                queue.append((node.left, level + 1))
            if node.right:
                queue.append((node.right, level + 1))

        return p_level + q_level
总结

在本篇文章中,我们讨论了如何使用深度优先搜索和广度优先搜索算法计算二叉树中两个节点之间的距离。无论使用哪种算法,我们都需要交替遍历左右子树,并查找包含两个节点的最小子树。