주제 설명 :
유효한 이진 검색 트리인지 확인 이진 트리를 감안할 때.
다음과 같은 특성을 갖는 이진 검색 트리를 가정 해 봅시다 :
트리의 왼쪽 자식 노드는 현재 노드의 수보다 단지 적게 포함되어 있습니다.
오른쪽 하위 트리 현재 노드의 노드 수보다 단지 더 포함되어 있습니다.
모든 왼쪽 하위 트리 오른쪽 하위 트리 자체도 이진 검색 트리해야합니다.
예 1 :
입력 :
2
/ \
1 3
출력 : 진정한
예 2 :
입력 :
5
/ \
14
/ \
36
출력 : 잘못된
결론 입력으로서 [5,1,4, 널, 널, 3,6].
5는 루트 노드이지만, 오른쪽 자식 노드 4입니다.
일반적인 아이디어 :
재귀 검증 :
- 현재 노드를 사용할 수없는 경우, 현재 노드의 값의 상한과 하한은 비교
- 그런 다음, 왼쪽 및 오른쪽 하위 트리의 단계를 반복
다음 사항에 유의하십시오
- 프로그램 상단 초기화, 낮은, 각각 언어 장개석과 음의 무한대, C ++ 및 사용 INT64_MIN INT64_MAX 가장 큰 나무를했다.
- 재귀 프로세스를 지속적으로 업데이트해야, 하한, 현재의 왼쪽 자식 노드 값의 상한, 현재의 우측 자식 노드 값의 하한
코드 :
/ * * * 이진 트리 노드에 대한 정의. * 구조체의 TreeNode { * INT의 발; * * TreeNode를 왼쪽; * * TreeNode를 오른쪽; *의 TreeNode (INT의 X) 발 (X), 오른쪽 (NULL) (NULL) 왼쪽 {} *}; * / 클래스 솔루션 { 공개 : 부울 isValidBST (TreeNode를의 *의 루트) { 반환 DFS를 (루트, INT64_MIN, INT64_MAX); } 부울 DFS (TreeNode를의 * 루트, 긴 INT 마일, 긴 INT의 엄마) { 경우 (루트 == NULL) 반환 사실 ; 만약(루트 -> 발 <= MI || 루트 -> 발> = MA) 반환 거짓 ; 다른 반환 DFS (루트 레벨> 왼쪽, 마일, 루트 레벨> 발) && DFS (루트 레벨> 오른쪽 루트 레벨> 발, 엄마); } };