📌  相关文章
📜  O(1)空间中给定两个节点之间的树的有序序列中的公共节点(1)

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

O(1)空间中给定两个节点之间的树的有序序列中的公共节点

在树中,两个节点之间的所有公共祖先节点集合就是这两个节点之间的有序序列。这样的话,我们只需要比较这两个节点的有序序列,找到最后一个相同的节点就是它们之间的公共节点。

为了方便说明,我们假设这棵树是一棵二叉搜索树,即左子树上所有节点的值小于父节点的值,右子树上所有节点的值大于父节点的值。

我们可以从根节点开始,比较当前节点和两个给定节点的值的大小关系:

  • 如果当前节点的值比这两个节点的值都小,说明公共节点一定在当前节点的右子树中,所以我们继续在右子树中查找。
  • 如果当前节点的值比这两个节点的值都大,说明公共节点一定在当前节点的左子树中,所以我们继续在左子树中查找。
  • 如果当前节点的值在这两个节点的值之间,说明公共节点就是当前节点,我们找到了最后一个相同的节点。

这种方法只需要常数级别的空间,因为我们只需要存储当前节点和两个给定节点的值,而不需要使用任何数据结构来存储路径或者遍历过程中的中间结果。

以下是基于 Python 的实现代码:

class TreeNode:
    def __init__(self, val=None, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def lowest_common_ancestor(root, p, q):
    while root:
        if root.val < p.val and root.val < q.val:
            root = root.right
        elif root.val > p.val and root.val > q.val:
            root = root.left
        else:
            return root

这个函数接受一个根节点和两个节点 pq,返回 pq 之间的公共节点。

具体用例:

A = TreeNode(6)
B = TreeNode(2)
C = TreeNode(8)
D = TreeNode(0)
E = TreeNode(4)
F = TreeNode(7)
G = TreeNode(9)
H = TreeNode(3)
I = TreeNode(5)

A.left = B
A.right = C

B.left = D
B.right = E

C.left = F
C.right = G

E.left = H
E.right = I

print(lowest_common_ancestor(A, D, F).val)  # 输出 6

这个例子中,两个节点 DF 的公共节点就是根节点 A