이진 트리에서 최소 공통 조상 (Lowest Common Ancestor) 탐색
개요
트리 구조의 최소 공통 조상(Lowest Common Ancestor: LCA)이란, 어느 2개의 노드가 주어졌을 때, 둘 다 자신 이하에 가지는 노드 중, 가장 낮은 (잎에 가까운) 위치에 있는 노드를 말한다. 를 가리킵니다. 한 노드가 다른 노드의 직접 조상이면 직접 조상이되는 노드가 LCA입니다. 예를 들어 아래의 이분 트리에서 6과 4의 LCA는 5, 0과 1의 LCA는 1입니다.
LCA를 탐색하는 알고리즘은 여러 가지가 있습니다만, 본 기사에서는 각 노드로부터 자신의 조상을 추적해 가, 최초로 만나는 공통의 조상을 찾아내는 기법을 소개합니다.
정책
각 노드에서 자신의 조상을 추적하려는 경우 각 노드는 자신의 부모를 알아야 합니다. 거기서 방침으로서는 아래와 같습니다.
참고 : 1에서는 주어진 두 노드의 부모가 발견되면 순회를 중단하는 것이 더 효율적이지만, 이번에는 편의상 모든 노드를 순회하기로 결정합니다.
구현 예
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
# 各ノードをDFSで巡回しつつ、親ノードをdictionaryに保存していく
def traverse(self, node, parents):
if node is None:
return parents
if node.left is not None:
parents[node.left] = node
self.traverse(node.left, parents)
if node.right is not None:
parents[node.right] = node
self.traverse(node.right, parents)
return parents
# ノードp, qのLCAを探索するメソッド
def lowestCommonAncestor(self, root, p, q):
# 各ノードをkey、その親をvalueに持つdictionaryを作成しておく
parents = {root: None}
parents = self.traverse(root, parents)
# 一方のノード(ここではp)の祖先を保存しておくためのsetを用意する
ancestors = set()
# 自分自身がLCAになる可能性もあるため、まずは自身をセットする
parent = p
# pの親を辿っていき、祖先となるノードを全てsetに保存していく
while parent is not None:
ancestors.add(parent)
parent = parents[parent]
# 次にqから親を辿っていき、pの祖先とぶつかった時点でLCAとみなす
node = q
while node not in ancestors:
node = parents[node]
return node
참고
Lowest Common Ancestor (Wikipedia)
최소 공통 조상
Reference
이 문제에 관하여(이진 트리에서 최소 공통 조상 (Lowest Common Ancestor) 탐색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/maebaru/items/0fec7d2987c4a1efaa8a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)