이 진 트 리 복원

이 진 트 리 의 우선 순 서 를 정 하고 중간 순 서 를 옮 겨 다 니 며 이 이 진 트 리 의 높이 를 계산 해 야 합 니 다.
입력 형식:
입력 은 먼저 정수 N (≤ 50) 을 드 리 고 나무의 결점 총수 입 니 다.다음 두 줄 은 선착순 과 중 서 를 차례로 보 여 줍 니 다. 모두 길이 가 N 인 중복 영문 자모 (대소 문자 구별) 가 포함 되 지 않 은 문자열 입 니 다.
출력 형식:
출력 은 이 두 갈래 나무의 높이 인 정수 입 니 다.
입력 예시:
9
ABDFGHIEC
FDHGIBEAC

출력 예시:
5

먼저 옮 겨 다 니 는 순 서 는 뿌리 - > 왼쪽 트 리 - > 오른쪽 트 리 입 니 다.
중간 순 서 는 왼쪽 트 리 - > 뿌리 - > 오른쪽 트 리 입 니 다.
다음 순서 로 옮 겨 다 니 는 순 서 는: 왼쪽 트 리 - > 오른쪽 트 리 - > 뿌리
전역 변 수 를 사용 하여 배열 을 정의 합 니 다. 재 귀 할 때 다음 값 만 전달 하고 배열 을 전달 하지 않 아 도 됩 니 다.
이 문 제 는 높이 를 구 하 는 것 이기 때문에 노드 의 데이터 와 관련 되 지 않 기 때문에 구조 체 에서 data 를 정의 할 필요 가 없고 나무의 구 조 를 구축 하면 된다.
첫 번 째 데 이 터 는 반드시 나무 뿌리 입 니 다. 중간 순서 배열 에 있 는 위 치 를 검색 하여 중간 순서 배열 을 왼쪽 서브 트 리 와 오른쪽 서브 트 리 로 나 누 는 동시에 왼쪽 글자 노드 의 갯 수 에 따라 먼저 순서 배열 을 좌우 서브 트 리 로 나 눕 니 다.이렇게 한 번 의 구분 을 한 후에 좌우 서브 트 리 의 순서 와 중간 순 서 를 확정 하고 재 귀 를 이용 하여 구분 했다.좌우 나무 가 언제 없 는 지 를 고려 해 야 한다. 답 은 분명 하 다. 뿌리 를 이용 해 중간 배열 을 나 눈 후 남 은 요소 가 없다 는 것 이다.
#include
#include

typedef struct node* Ptr;
struct node{
	Ptr left;
	Ptr right;
};

char pre[50],in[50];
int num;

//         、         、    
Ptr Restore( int preMin, int preMax, int inMin, int inMax);
int GetHeight( Ptr head);

int main(void){
	Ptr BT;
	int height;
	scanf("%d", &num);
	scanf("%s", pre);
	scanf("%s", in);
	BT = Restore( 0, num - 1, 0, num - 1);
	height = GetHeight( BT);
	printf("%d", height);
	return 0;
}

Ptr Restore( int preMin, int preMax, int inMin, int inMax){
	Ptr root;
	int i;
	root = (Ptr)malloc(sizeof(struct node));
	root->left = root->right = NULL;
	for( i = inMin; i <= inMax; i++){
		if( pre[preMin] == in[i]){
			if( i != inMin) root->left = Restore( preMin + 1, preMin + inMin - 1, inMin, i - 1); //       
			if( i != inMax) root->right = Restore( preMin + i - inMin + 1, preMax, i + 1, inMax);//        
			break;
		}
	}
	return root;
}

int GetHeight( Ptr head){
	int hl, hr, max;
	if( head == NULL) return 0;
	else{
		hl = GetHeight( head->left);
		hr = GetHeight( head->right);
		max = hl > hr ? hl : hr;
	}
	return max + 1;
}

좋은 웹페이지 즐겨찾기