인프런 커뮤니티 질문&답변

Ambition님의 프로필 이미지
Ambition

작성한 질문수

코딩테스트 [ ALL IN ONE ]

[코테 적용] 👉 Postorder (후반부)

제 경우에는 이렇게 코드를 짜봤는데 이것도 맞을까요?

해결된 질문

작성

·

193

1

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        if root is None: # check whether Node is empty
            return
        if root is p or root is q:
            return root
        
        # root 노드가 p 또는 q가 아니면 순회하도록 재귀함수 호출
        l = self.lowestCommonAncestor(root.left, p, q) # code 1
        r = self.lowestCommonAncestor(root.right, p, q) # code 2
        
        # p와 q 조건 검사를 마친 후(모든 노드를 순회하는 것은 아님)
        if l and r:
            return root
        elif l:
            return l
        else:
            return r

먼저 LCA함수를 호출하면 root가 가리키는 노드가 있는지 체크한 다음에 계속해서 p 또는 q 노드가 맞는지 확인을 합니다. 만약 p 또는 q 노드가 아니면 재귀함수를 호출해서 자식 노드로 더 깊이 순회하도록 만듭니다. 역시 자식 노드들도 p 또는 q 노드가 맞는지 검사한 후 맞으면 l 또는 r에 그 노드를 저장합니다.

여기서 궁금한 점은, 자기 자신이 공통 조상이 될 때인데요. 이렇게 되면 더 깊이까지 탐색하지 않아도

elif l: return l 에 의해서 왼쪽만 탐색했으니까 시간복잡도가 O(logN)인가요? 아니면 다른 케이스들도 고려해서 최악의 경우 모든 노드를 탐색해야되니까 O(N)이 되는건가요?

답변 1

1

개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

안녕하세요 Ambition님.

해당 코드는 정확하게 잘 구현하셨습니다.

질문주신건, 시간복잡도를 궁금해하셨는데, 시간복잡도는 주어진 트리의 형태와 pq의 위치에 따라 다릅니다.

일단 트리가 완전히 균형이 잡힌 이진 탐색 트리라면, 시간 복잡도는 O(logN) 이고 // 트리가 한쪽으로 치우친 연결 리스트와 같은 형태로 편향된 경우, 시간 복잡도는 O(N)이 될 수 있습니다.

Ambition님의 프로필 이미지
Ambition
질문자

감사합니다 :)

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기