본문 바로가기

공부/프로그래밍

[C언어] 백준 5639번 이진 검색 트리

*이 포스트에서 문제의 답안은 C언어로 구성했습니다.

백준 사이트 프로그래밍 문제 c언어 답안

#include <stdio.h>
#include <stdlib.h>

typedef int BTData;

typedef struct _bTreeNode
{
	BTData data;
	struct _bTreeNode * left;
	struct _bTreeNode * right;
} BTreeNode;


typedef void VisitFuncPtr(BTData data);

BTreeNode * MakeBTreeNode(BTData data)
{
	BTreeNode * nd = (BTreeNode*)malloc(sizeof(BTreeNode));

	nd->data = data;
	nd->left = NULL;
	nd->right = NULL;
	return nd;

}

void PostorderTraverse(BTreeNode * bt)
{
	if (bt == NULL)
		return;
	PostorderTraverse(bt->left);
	PostorderTraverse(bt->right);
	printf("%d\n", bt->data);
}

BTreeNode * AssignTree(BTreeNode * bt, BTData data) {
	if (bt == NULL){
		bt = MakeBTreeNode(data);
		return bt;
	}
	else if (data < bt->data)
		{
			bt->left=AssignTree(bt->left, data);
		}
	else if (data > bt->data)
		{
			bt->right=AssignTree(bt->right, data);
		}
	return bt;
}


int main(void) 
{
	int u;
	BTreeNode * bt = NULL;
	while (scanf("%d", &u) !=EOF)
	{
		bt = AssignTree(bt, u);
	}
	PostorderTraverse(bt);
}

해설
이진 트리 함수는 필자가 배운 책에 있는 것을 썼습니다. 기본적으로 간단한 이진 트리 함수를 짜고 재귀함수를 이용한 새로운 함수를 만들어서 문제를 해결하면 됩니다. 이 문제의 포인트는 입력의 횟수가 정해져있지 않다는 것인데, 이것은 'while (scanf("%d", &u) !=EOF)'으로 해결합니다. 이 !=EOF란 조건은 입력이 받는 것까지 전부 읽어낸다는 것으로 비주얼 스튜디오 같은 걸로 실행했을 때 결과를 볼 수는 없지만 백준 사이트에서 제출했을 때는 제대로 작동합니다.

728x90