최대 BST의 하위 트리

이진 트리 감안할 때, 이진 검색 트리 (BST)이 최대가 노드의 가장 많은 서브 트리를 의미 곳, 가장 큰 하위 트리를 찾을 수 있습니다.

참고 :
하위 트리의 모든 자손을 포함해야합니다.
다음은 그 예이다 :

    10 
    / \ 5   15
   / \    \ 
  1 8    7

   

이 경우 가장 큰 BST의 하위 트리가 강조 하나입니다.
반환 값은 3 서브 트리의 크기입니다.

후속 :
당신은 O (n)의 시간 복잡도와 그것을 해결하는 방법을 알아낼 수 있습니까?

이진 트리에서 찾기와이 문제의 시작 부분에 안전을 제공 긴 증가 부분 배열을 증명하는 것은 주제의 클래스는 것을, BST의 가장 큰 하위 트리입니다. 그냥 나중에이 경우 시험 여부 아니라는 것을 발견 배열에서 동적 예약 주문을 교체 하위 트리 전체 조각의 구성 후, 그래서 우리는 각 노드에 대해, 모든 BST 경우는 왼쪽과 오른쪽 서브 트리가, BST를 여부를 고려, 즉으로 나눔입니다. 그것을 할 수있는 전략을 변경해야하고 정복,이 노드 테스트를 다시 추가 BST인지 서브 트리 즉 leftMax <root.val && rightMin> 현재의 서브 트리의 크기를 계산 한 후, 좌측 및 우측 서브 트리를 사용할 필요가 크기 때문에,이 문제는 다수의 변수를 각각의 반복 반환해야 root.val .. 크기, BST의 하위 트리의 현재 상태 정보가 플래그 변수를 추가 할 수 있다면 분, 최대는. 물론 반환해야하거나 우리가 사용할 수있는 균형 이진 트리

실질적으로, 0 이상이 높이를 나타내는 것보다 정말로 더 -1 불균형을 나타내고 있으므로 여기서는 크기와 비 BST 서브 트리를 나타낼 수 = -1. 각 노드 처리 시간 복잡도는 O (n)은, 공간적 복잡도 인 스택의 높이는 다음 O (logn)는, 코드이다 :

#의 이진 트리 노드에 대한 정의. 
#의 클래스의 TreeNode (객체) : 
#      데프 __init의 __ (자기, 배) : 
#의          self.val는 = X 
#          self.left = 없음 
#          self.right = 없음 

클래스 솔루션 (객체) :
     데프 largestBSTSubtree (자기 루트) :
         "" " 
        : 루트 유형 :의 TreeNode 
        : RTYPE : INT 
        " "" 
        경우  없는 루트 :
             복귀 0 
        입술 = [0] 
        최소, 최대 크기 = self.helper (루트 해상도)
         복귀 입술 [0]
    DEF 도우미 (자체는, 루트, RES) :
         IF  하지 루트 :
             반환 -sys.maxint -1의 sys.maxint를을 , 0 비교를 용이하게하기 위해, #주의 노드가 존재하지 않는, 최소는 최대 값을 최대로 정의 된 최소 값으로 정의된다. 또는 INF의
             #의 복귀 0, 플로트 ( "INF"), 플로트 ( '- INF') 
        leftMin, leftMax, leftSize = self.helper (root.left, RES) 
        rightMin, rightMax, rightSize = self.helper을 (root.right, RES)
         IF leftSize == -1 또는 rightSize == -1 또는 leftMax> root.val 또는 rightMin < root.val :
             복귀 0, 0, -1
         밖의 :
            크기 = leftSize rightSize + + 1 
            입술 [0] = 최대 (입술 [0], 크기)
             리턴 분 (leftMin, root.val), 최대 (root.val, rightMax) 크기 #除去sys.maxint를和sys.maxint를的影响.

원본 최적화되지 코드 :

#의 이진 트리 노드에 대한 정의. 
#의 클래스의 TreeNode (객체) : 
#      데프 __init의 __ (자기, 배) : 
#의          self.val는 = X 
#          self.left = 없음 
#          self.right = 없음 

클래스 솔루션 (객체) :
     데프 largestBSTSubtree (자기 루트) :
         "" " 
        : 루트 유형 :의 TreeNode 
        : RTYPE : INT 
        " "" 
        경우  없는 루트 :
             복귀 0 
        입술 = [0] 
        최소, 최대, 플래그, 크기 = self.helper (루트 해상도)
         복귀 입술 [0]
    데프 도우미 (자기, 루트, 고해상도) :
         경우  하지가 root.left  하지 root.right : 
            고해상도 [0] = 최대 (고해상도 [0], 1 )
             반환 root.val, root.val, 사실, 1  = 최대 = root.val 
        크기 = -1 
        플래그 = 
        leftSize = rightSize = 0
         경우 root.left : 
            leftMin, leftMax, leftFlag, leftSize = self.helper (root.left, 고해상도)
             의 경우  되지 leftFlag 또는 leftMax> root.val :
                플래그 = 거짓
             다른 : 
                최소 = leftMin
         경우 root.right : 
            rightMin, rightMax, rightFlag, rightSize = self.helper (root.right, 고해상도)
             의 경우  하지 rightFlag 또는 rightMin < root.val : 
                플래그 = 거짓
             다른 : 
                최대 = rightMax
         경우  하지 플래그 :
             반환 -1, -1 , 거짓, 크기,
         다른  :
            크기 = 1 + + leftSize rightSize 
            입술 [0] = 최대 (입술 [0], 크기)를
             반환 최소, 최대, 사실 크기

 

HTTPS : //www.cnblogs.com/sherylwang/p/5666115.html 재현

추천

출처blog.csdn.net/weixin_33736649/article/details/94526119