둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (218) N
    • BOJ (171) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (13)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5) N
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

1991번: 트리 순회 (BOJ C/C++)
BOJ/트리

1991번: 트리 순회 (BOJ C/C++)

2022. 2. 5. 23:20

1991번: 트리 순회

사용 언어: C

문제

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.

입력

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.

출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

 

풀이

저번 '10816번: 숫자 카드 2'에서 생각지도 못한 이진 탐색 트리로 푸신 본을 보고 나도 트리 문제를 풀고 싶어서 트리 쪽에서 간단한 기본 개념 문제를 풀었다. 물론 10816번은 이진 탐색 트리로 풀면 시간복잡도와 공간복잡도가 더 커서 비효율적이긴하다. 풀이는 최대한 직관적이게 써서 설명이 필요 없을 거라고 생각한다. 

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

//트리 노드 정의
typedef struct TreeNode{
	char ele;
	struct TreeNode *left;
	struct TreeNode *right;
}TreeNode;

//새로운 노드 생성
TreeNode *New_TreeNode(char data)
{
	TreeNode *New = (TreeNode*)malloc(sizeof(TreeNode));
	New->ele = data;
	New->left = NULL; New->right = NULL;
	return New;
}

//트리 검색 함수
TreeNode *Search_TreeNode(TreeNode *TN, char data)
{
	if(TN != NULL)
	{
		if(TN->ele == data)
			return TN;
		else
		{
			TreeNode *temp = Search_TreeNode(TN->left, data);
			if(temp != NULL)
				return temp;
			
			return Search_TreeNode(TN->right, data);
		}
		
	}
	return NULL;
}

//data1이 부모 노드, data2가 왼쪽 자식 노드, data3가 오른쪽 자식 노드
void Insert_TreeNode(TreeNode *TN, char data1, char data2, char data3)
{
	TN->ele = data1;
	if(data2 != '.')
		TN->left = New_TreeNode(data2);
	if(data3 != '.')
		TN->right = New_TreeNode(data3);
}

//전위 순회
void Preorder_Traversal(TreeNode *TN)
{
	if(TN == NULL)
		return;
	printf("%c",TN->ele);
	Preorder_Traversal(TN->left);
	Preorder_Traversal(TN->right);
}

//중위 순회
void Inorder_Traversal(TreeNode *TN)
{
	if(TN == NULL)
		return;
	Inorder_Traversal(TN->left);
	printf("%c",TN->ele);
	Inorder_Traversal(TN->right);
}

//후위 순회
void Postorder_Traversal(TreeNode *TN)
{
	if(TN == NULL)
		return;
	Postorder_Traversal(TN->left);
	Postorder_Traversal(TN->right);
	printf("%c",TN->ele);
}

int main(void)
{
	int N;
	TreeNode *Tree = New_TreeNode(NULL); 
	TreeNode *Temp_Node;
	
	scanf("%d",&N);
	getchar();
	for(int i=0; i<N; i++)
	{
		char parent, left, right;
		scanf("%c %c %c",&parent,&left,&right);
		getchar();
		Temp_Node = Search_TreeNode(Tree, parent);
		if(Temp_Node == NULL)
			Insert_TreeNode(Tree, parent, left ,right);
		else
			Insert_TreeNode(Temp_Node, parent, left, right);
	}
	Preorder_Traversal(Tree); printf("\n");
	Inorder_Traversal(Tree); printf("\n");
	Postorder_Traversal(Tree); printf("\n");
	
	return 0;
}
저작자표시 (새창열림)

'BOJ > 트리' 카테고리의 다른 글

6549번: 히스토그램에서 가장 큰 직사각형 (BOJ C/C++)  (0) 2022.02.24
11279번: 최대 힙 (BOJ C/C++)  (0) 2022.02.18
1927번: 최소 힙 (BOJ C/C++)  (0) 2022.02.18
    'BOJ/트리' 카테고리의 다른 글
    • 6549번: 히스토그램에서 가장 큰 직사각형 (BOJ C/C++)
    • 11279번: 최대 힙 (BOJ C/C++)
    • 1927번: 최소 힙 (BOJ C/C++)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바