이진 트리의 가장 낮은 공통 조상

3311 단어 leetcodetheabbiedsa
이진 트리가 주어지면 트리에서 주어진 두 노드의 최저 공통 조상(LCA)을 찾으십시오.

definition of LCA on Wikipedia에 따르면: "가장 낮은 공통 조상은 두 노드pq 사이에서 Tp를 모두 포함하는 q의 가장 낮은 노드로 정의됩니다(여기서 노드를 허용합니다. 자신의 후손이 되는 것)."

예 1:



입력: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
출력: 3
설명: 노드 5와 1의 LCA는 3입니다.

예 2:



입력: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
출력: 5
설명: 노드 5와 4의 LCA는 5입니다. 노드는 LCA 정의에 따라 자신의 자손이 될 수 있기 때문입니다.

예 3:

입력: 루트 = [1,2], p = 1, q = 2
출력: 1

제약:
  • 트리의 노드 수가 [2, 105] 범위에 있습니다.
  • -109 <= Node.val <= 109
  • 모든Node.val은 고유합니다.
  • p != q
  • pq가 트리에 존재합니다.

  • 해결책:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    # class Solution:
    #     def isInTree(self, root, node):
    #         if root:
    #             if root.val == node.val:
    #                 return True
    #             if self.isInTree(root.left, node) or self.isInTree(root.right, node):
    #                 return True
    #         return False
    
    #     def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
    #         if root:
    #             if root.val == p.val or root.val == q.val:
    #                 return root
    #             pInLeft = self.isInTree(root.left, p)
    #             qInLeft = self.isInTree(root.left, q)
    #             if pInLeft and qInLeft:
    #                 return self.lowestCommonAncestor(root.left, p, q)
    #             if not pInLeft and not qInLeft:
    #                 return self.lowestCommonAncestor(root.right, p, q)
    #             if pInLeft ^ qInLeft:
    #                 return root
    
    class Solution:
        def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
            nodepaths = [None, None]
            paths = [[root]]
            while len(paths) > 0:
                curr = paths.pop()
                if curr[-1].val == p.val:
                    nodepaths[0] = curr
                if curr[-1].val == q.val:
                    nodepaths[1] = curr
                if nodepaths[0] and nodepaths[1]:
                    break
                if curr[-1].left:
                    paths.append(curr + [curr[-1].left])
                if curr[-1].right:
                    paths.append(curr + [curr[-1].right])
            i = 0
            k = min(len(nodepaths[0]), len(nodepaths[1]))
            while nodepaths[0][i].val == nodepaths[1][i].val:
                i += 1
                if i >= k:
                    break
            return nodepaths[0][i - 1]
    

    좋은 웹페이지 즐겨찾기