"안전의 서비스를 증명"- 이진 검색 트리의 후속 탐색 순서를 (자바)

제목 설명

정수 배열을 입력 배열은 이진 검색 트리를 통과 한 후 결정의 결과가 아닙니다. 만약 출력 예, 그렇지 않으면 출력 번호 임의의 두 숫자의 입력 배열이 서로 다른 가정하자.

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        
    }
}

 

아이디어 :

첫 번째 불러 오기 이진 검색 트리를 알고 :

(또한 : 이진 검색 트리, 이진 정렬 트리) 이진 검색 트리 (이진 검색 트리), 중 빈 나무, 또는 다음과 같은 특성을 갖는 이진 트리를 : 그것은 만약 왼쪽 서브 트리가 비어 있지 않은 후 왼쪽 모든 하위 트리 노드의 값은 덜 루트 노드의 값보다, 오른쪽 서브 트리가 비어 있지 않은 경우, 다음 오른쪽 하위 트리 루트의 값보다 큰 모든 노드, 그 왼쪽 그들은 마우스 오른쪽 서브 트리 있었다 이진 정렬 트리 .
열 등 :

우리는 후속 이송로 (루트에 대한) 바이너리 서치 트리 위의에 대해 쓸 :

2,5,3,8,7,6 

이러한 규칙 및 후속 통과 이진 검색 트리에 따르면, 우리는 알 수 있습니다 :

  1. 마지막 요소는 루트 노드입니다;
  2. 마지막 요소보다 큰 트리의 오른쪽 서브 트리의 요소이며, 나무가, 마지막 하나보다 작은 트리의 왼쪽 서브 트리의 요소입니다;

요약하면, 우리는 나무로 나눌 수있다 [2,5,3] [8,7] [6]

[6] 루트이고, [2,5,3]가 후속 이송 좌측 서브 트리이며, [8,7]은 후속 이송 우측 서브 트리이다.

우리는 상기 한 바와 같이 분열을 계속하기 전에 왼쪽과 오른쪽 서브 트리에서 하위 트리로 나눌 수 있습니다;

규칙의 위반 사항 이진 검색 트리가없는 경우 최종 요소 부문까지 분할 과정은, 그것은 변화가 이후의 탐색 트래버스 이진 검색 트리를 따라 것을 보여준다.

 

구현 :

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if (sequence == null || sequence.length == 0)
            return false;
        return check(sequence,0,sequence.length - 1);
    }
    
    private boolean check(int[] sequence, int first, int last){
        if (last - first <= 1)
            return true;
        int rootVal = sequence[last];
        int cutIndex = first;
        while (cutIndex < last && sequence[cutIndex] <= rootVal)
            cutIndex++;
        for (int i = cutIndex; i < last; i ++)
            if (sequence[i] < rootVal)
                return false;
        return check(sequence,first,cutIndex - 1) && check(sequence,cutIndex,last -1);
    }
    
}

 

 

게시 74 개 원래 기사 · 원의 찬양 (20) · 전망 1886

추천

출처blog.csdn.net/love_MyLY/article/details/103980920