이진 트리에서 최소 공통 조상 (Lowest Common Ancestor) 탐색

개요



트리 구조의 최소 공통 조상(Lowest Common Ancestor: LCA)이란, 어느 2개의 노드가 주어졌을 때, 둘 다 자신 이하에 가지는 노드 중, 가장 낮은 (잎에 가까운) 위치에 있는 노드를 말한다. 를 가리킵니다. 한 노드가 다른 노드의 직접 조상이면 직접 조상이되는 노드가 LCA입니다. 예를 들어 아래의 이분 트리에서 6과 4의 LCA는 5, 0과 1의 LCA는 1입니다.



LCA를 탐색하는 알고리즘은 여러 가지가 있습니다만, 본 기사에서는 각 노드로부터 자신의 조상을 추적해 가, 최초로 만나는 공통의 조상을 찾아내는 기법을 소개합니다.

정책



각 노드에서 자신의 조상을 추적하려는 경우 각 노드는 자신의 부모를 알아야 합니다. 거기서 방침으로서는 아래와 같습니다.
  • 각 노드를 순환하고 각 노드의 부모를 사전에 저장합니다.
  • 주어진 두 노드 중 하나의 노드에서 부모를 추적하고 루트에 도달 할 때까지 추적 한 노드 (모든 조상)를 set에 저장합니다.
  • 다른 노드에서 부모를 추적하고 2로 저장된 세트에 포함 된 노드가 나타나면 공통 조상 (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)
    최소 공통 조상
  • 좋은 웹페이지 즐겨찾기