Метод 1: использование родительских указателей
Предполагая, что дерево имеет родительские указатели, мы можем найти LCA трех узлов, выполнив следующие шаги:
- Перейти от первого узла к корню и сохранить все посещенные узлы в наборе.
- Перейдите от второго узла к корню и для каждого посещенного узла проверьте, существует ли он в наборе. Первый найденный общий узел — это LCA.
- Если общий узел не найден, верните None.
def find_lca_with_parent_pointers(node1, node2, node3):
visited = set()
while node1:
visited.add(node1)
node1 = node1.parent
while node2:
if node2 in visited:
return node2
node2 = node2.parent
while node3:
if node3 in visited:
return node3
node3 = node3.parent
return None
Метод 2: рекурсивный подход
В этом методе мы рекурсивно обходим дерево и находим LCA, проверяя, равен ли текущий узел какому-либо из заданных узлов или возвращают ли какие-либо два дочерних поддерева ненулевые значения.
def find_lca_recursive(root, node1, node2, node3):
if root is None:
return None
if root == node1 or root == node2 or root == node3:
return root
left_lca = find_lca_recursive(root.left, node1, node2, node3)
right_lca = find_lca_recursive(root.right, node1, node2, node3)
if left_lca and right_lca:
return root
return left_lca if left_lca else right_lca
Метод 3: использование нескольких обходов по порядку
Этот метод включает в себя выполнение трех обходов по порядку и ведение подсчета посещенных узлов. Узел со счетом три будет LCA.
def find_lca_with_inorder_traversal(root, node1, node2, node3):
count = [0]
def inorder_traversal(node):
if node is None:
return None
left_lca = inorder_traversal(node.left)
if left_lca:
return left_lca
count[0] += 1 if node == node1 or node == node2 or node == node3 else 0
if count[0] == 3:
return node
right_lca = inorder_traversal(node.right)
return right_lca
return inorder_traversal(root)
В этой статье мы рассмотрели три различных метода поиска наименьшего общего предка (LCA) трех узлов в дереве. Мы обсудили использование родительских указателей, рекурсивный подход и множественный обход в неупорядоченном порядке. Каждый метод имеет свои преимущества и особенности сложности. В зависимости от конкретных требований вашего проекта вы можете выбрать наиболее подходящий метод поиска LCA трех узлов дерева.