이진 트리에서 최소 공통 조상 (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.)