04 - 트 리 4 같은 이 진 트 리 (25 점) (데이터 구조) (C 언어 구현) 여부

44938 단어 데이터 구조
삽입 시퀀스 를 지정 하면 두 갈래 검색 트 리 를 유일 하 게 확인 할 수 있 습 니 다.그러나 주어진 두 갈래 검색 트 리 는 다양한 삽입 서열 로 구 할 수 있다.예 를 들 어 각각 시퀀스 {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

이 문 제 는 같은 이 진 트 리 인지 아 닌 지 를 판단 하 는 특징 적 인 입력 순 서 를 요구 합 니 다.우리 먼저 결점 의 정 의 를 봅 시다.
#include<stdio.h>
#include<stdlib.h>
struct TreeNode
{
	int data;
	struct TreeNode *left;
	struct TreeNode *right;
	int flag;
};
typedef struct TreeNode *BinTree;

이것 은 우리 가 실현 해 야 할 함수 이다.
BinTree CreatTree(int N);//   
BinTree NewNode(int i);//    
BinTree Insert(BinTree T,int item);//       
int judge(BinTree T,int N);//  
int check(BinTree T,int t);//  
void reset(BinTree T);//  
void freeT(BinTree T);//  
```javascript

       :
```javascript
BinTree CreatTree(int N)
{
	int i,t;
	BinTree T;
    scanf("%d",&t);
    T=NewNode(t);
	for(i=1;i<N;i++)
	{
		scanf("%d",&t);
		T=Insert(T,t);
		
	}
	return T;
}

결점 을 만들다
BinTree NewNode(int i)
{
    BinTree T;
    T=(BinTree)malloc(sizeof(struct TreeNode));
    T->data=i;
    T->left=T->right=NULL;
    return T;
}

트 리 에 요소 삽입
BinTree Insert(BinTree T,int item)
{
	if(!T)
	{
		T=(BinTree)malloc(sizeof(struct TreeNode));
		T->data=item;
		T->left=T->right=NULL;
	}
	else{
        if(item<T->data) T->left=Insert(T->left,item);
	if(item>T->data) T->right=Insert(T->right,item);
    }
    return T;
}

나무의 판단
int judge(BinTree T,int N)
{
	int i,t,error=0;
	scanf("%d",&i);
	if(i!=T->data)error=1;//          
	else
		T->flag=1;//          
	for(i=1;i<N;i++)//       
	{
		scanf("%d",&t);
		if(!check(T,t)&&(!error))error=1;//         0  error   0
	}
	if(error)return 0;
	else return 1;
}

검사 함수
int check(BinTree T,int t)
{
	if(T->flag)
	{
		if(t<T->data)return check(T->left,t);//        
		else if(t>T->data)return check(T->right,t);//        
		else return 0;//                  
	}
	else
	{
		if(t==T->data)//         
		{
			T->flag=1;
			return 1;
		}
		else 
			return 0;
	}
}

함수 초기 화
void reset(BinTree T)//   flag    0
{
	if(T)
	{
		T->flag=0;
		if(T->left)
			reset(T->left);
			if(T->right)
				reset(T->right);
	}
}

방출 수
void freeT(BinTree T)
{
	if(T->left)freeT(T->left);
	if(T->right)freeT(T->right);
	free(T);
}

글 의 총 코드 는 다음 과 같다.
#include<stdio.h>
#include<stdlib.h>
struct TreeNode
{
	int data;
	struct TreeNode *left;
	struct TreeNode *right;
	int flag;
};
typedef struct TreeNode *BinTree;
BinTree CreatTree(int N);
BinTree NewNode(int i);
BinTree Insert(BinTree T,int item);
int judge(BinTree T,int N);
int check(BinTree T,int t);
void reset(BinTree T);
void freeT(BinTree T);
BinTree CreatTree(int N)
{
	int i,t;
	BinTree T;
    scanf("%d",&t);
    T=NewNode(t);
	for(i=1;i<N;i++)
	{
		scanf("%d",&t);
		T=Insert(T,t);
		
	}
	return T;
}
BinTree NewNode(int i)
{
    BinTree T;
    T=(BinTree)malloc(sizeof(struct TreeNode));
    T->data=i;
    T->left=T->right=NULL;
    return T;
}
BinTree Insert(BinTree T,int item)
{
	if(!T)
	{
		T=(BinTree)malloc(sizeof(struct TreeNode));
		T->data=item;
		T->left=T->right=NULL;
	}
	else{
        if(item<T->data) T->left=Insert(T->left,item);
	if(item>T->data) T->right=Insert(T->right,item);
    }
    return T;
}
int judge(BinTree T,int N)
{
	int i,t,error=0;
	scanf("%d",&i);
	if(i!=T->data)error=1;
	else
		T->flag=1;
	for(i=1;i<N;i++)
	{
		scanf("%d",&t);
		if(!check(T,t)&&(!error))error=1;
	}
	if(error)return 0;
	else return 1;
}
int check(BinTree T,int t)
{
	if(T->flag)
	{
		if(t<T->data)return check(T->left,t);
		else if(t>T->data)return check(T->right,t);
		else return 0;
	}
	else
	{
		if(t==T->data)
		{
			T->flag=1;
			return 1;
		}
		else 
			return 0;
	}
}
void reset(BinTree T)
{
	if(T)
	{
		T->flag=0;
		if(T->left)
			reset(T->left);
			if(T->right)
				reset(T->right);
	}
}
void freeT(BinTree T)
{
	if(T->left)freeT(T->left);
	if(T->right)freeT(T->right);
	free(T);
}
int main()
{
	int i,N,L;
	BinTree T;
	scanf("%d",&N);
	while(N)
	{
		scanf("%d",&L);
		T=CreatTree(N);
		for(i=0;i<L;i++)
		{
			if(judge(T,N))printf("Yes
"
); else printf("No
"
); reset(T); } freeT(T); scanf("%d",&N); } return 0; }

코드 를 열심히 체험 하고 생각 한 후에 문 제 를 쓰 시 길 바 랍 니 다. 좋 으 면 좋아요!많이 늘 었 으 면 좋 겠 어 요!!

좋은 웹페이지 즐겨찾기