📌  相关文章
📜  位于连接二叉树中的两个节点的路径中的最小和最大节点(1)

📅  最后修改于: 2023-12-03 14:49:33.640000             🧑  作者: Mango

位于连接二叉树中的两个节点的路径中的最小和最大节点

在一棵二叉树中,路径是指从一个节点到另一个节点的序列,其中下一节点是前一节点的子节点(左子节点或右子节点)。连接二叉树中的两个节点的路径是指路径起点节点和路径终点节点没有公共祖先。如下图所示:

连接二叉树示例

在上图中,节点4和节点6之间的路径是4->2->1->3->6,路径中的最小值是1,最大值是6。

下面,我们将讨论如何用代码实现寻找连接二叉树中两个节点路径的最小值和最大值。

算法实现

我们可以通过寻找两个节点的LCA来找到这两个节点之间的路径。然后,我们可以在路径上找到最小值和最大值。对于寻找LCA,可以使用递归或迭代方法。以下是递归方法的代码:

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root or root == p or root == q:
            return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if left and right:
            return root
        return left if left else right
        
    def findMinMax(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> List[int]:
        lca = self.lowestCommonAncestor(root, p, q)
        path = []
        self.getPath(lca, p, path)
        self.getPath(lca, q, path)
        return min(path), max(path)
        
    def getPath(self, root: 'TreeNode', target: 'TreeNode', path: List[int]) -> bool:
        if not root:
            return False
        path.append(root.val)
        if root == target:
            return True
        if self.getPath(root.left, target, path) or self.getPath(root.right, target, path):
            return True
        path.pop()
        return False

这个算法的时间复杂度是O(n),其中n是二叉树中的节点数。其中,查找LCA的时间复杂度是O(n),寻找路径的时间复杂度是O(n)。空间复杂度是O(n),用于存储路径。

总结

通过查找LCA,我们可以找到连接二叉树中两个节点路径的最小值和最大值。这个算法的时间复杂度是O(n),其中n是二叉树中的节点数。这个算法的空间复杂度是O(n)。