이진 트리 감안할 때, 이진 검색 트리 (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 재현