데이터 구조 - 같은 두 갈래 검색 트 리 인지 판단

2584 단어 데이터 구조
같은 이 진 트 리 검색 여부 (25 분)
삽입 시퀀스 를 지정 하면 두 갈래 검색 트 리 를 유일 하 게 확인 할 수 있 습 니 다.그러나 주어진 두 갈래 검색 트 리 는 다양한 삽입 서열 로 구 할 수 있다.예 를 들 어 각각 시퀀스 {2, 1, 3} 과 {2, 3, 1} 에 비 어 있 는 이 진 트 리 를 삽입 하면 같은 결 과 를 얻 을 수 있 습 니 다.따라서 입력 한 각종 삽입 시퀀스 에 대해 서 는 같은 두 갈래 검색 트 리 를 만 들 수 있 는 지 판단 해 야 합 니 다.
입력 형식:
몇 개의 그룹 테스트 데 이 터 를 포함 하 는 지 입력 하 십시오.각 조 데이터 의 첫 줄 에 두 개의 정수 N 을 드 립 니 다. (≤ 10) 과 L 은 각각 각 서열 에 요소 가 삽 입 된 개수 와 검사 가 필요 한 서열 개수 이다.두 번 째 줄 은 빈 칸 으로 구 분 된 정수 N 개 를 초기 삽입 시퀀스 로 보 여 줍 니 다.마지막 으로 L 줄 은 줄 마다 N 개의 삽 입 된 요 소 를 보 여 주 며 L 개의 검사 가 필요 한 시퀀스 에 속 합 니 다.
간단하게 말하자면, 우 리 는 모든 삽입 서열 이 1 에서 N 까지 의 배열 이 라 고 보장 한다.N 이 0 일 때 표지 입력 이 끝 났 습 니 다. 이 데 이 터 는 처리 하지 마 십시오.
출력 형식:
각 그룹 에 검사 해 야 할 시퀀스 입 니 다. 생 성 된 이 진 검색 트 리 가 초기 시퀀스 와 같 으 면 "Yes" 를 출력 합 니 다. 그렇지 않 으 면 "No" 를 출력 합 니 다.
입력 예시:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

출력 예시:
Yes
No
No

 제 생각 은 이 렇 습 니 다. 먼저 표준 이 진 트 리 (아래 AC 코드 에서 제시 합 니 다) 를 구축 하고 배열 로 그의 선 서 를 저장 한 다음 에 요구 에 따라 판단 해 야 할 트 리 를 만 듭 니 다. 매번 표준 이 진 트 리 의 선 서 를 비교 합 니 다. 다 르 면 다 르 고 같 으 면 같 습 니 다.
 
주의: 사고방식 은 간단 하지만 일부 코드 를 쓸 때 많은 세부 적 인 문제 가 발생 한다. 예 를 들 어 선착순 으로 옮 겨 다 니 는 비 교 를 할 때 귀속 함 수 는 어떻게 써 야 하 는가...이 문 제 는 자신 이 쓴 후에 AC 코드 를 보 는 것 을 추천 합 니 다.
#include 

using namespace std;
int N,L,pos,samejudgement[100];


typedef struct node
{
    node(int a,node* b,node* c)
    {
        data=a;
        l=b;
        r=c;
    }
    int data;
    struct node *l;
    struct node *r;
}*BST;

void PreOrderTraverse(BST T)
{
    if(T)
    {
        samejudgement[pos++]=T->data;
        PreOrderTraverse(T->l);
        PreOrderTraverse(T->r);
    }
}

bool PreOrderTraverse_test(BST T)
{
    if(T)
    {

       // cout<data) return false;
       // cout<l)) return false;
        if(!PreOrderTraverse_test(T->r)) return false;
    }

    return true;

}

void Inset_BST(BST &T,int data)
{
    if(T==NULL)
    {
        T=new node(data,NULL,NULL);
    }
    else if(T->data > data)
    {
        Inset_BST(T->l,data);
    }
    else Inset_BST(T->r,data);
}



int main()
{

    while(scanf("%d",&N)!=EOF)
    {
        if(N) scanf("%d",&L);
        else break;

        pos=0;
        memset(samejudgement,0,sizeof(samejudgement));
        BST tree=NULL;
        for(int i=0; i

좋은 웹페이지 즐겨찾기