[백준1991] 트리 순회

Hyeongmin Jung·2025년 11월 17일

java

목록 보기
29/32

링크 | https://www.acmicpc.net/problem/1991

문제 |

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

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

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

입력 |

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

출력 |

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

예제 |

입력

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

출력

ABDCEFG
DBAECFG
DBEGFCA

Solution |

  • 연결리스트 구조 : 메모리상 떨어진 곳의 데이터를 주소참조를 통해서 연결하는 데이터구조. 배열에 비해 데이터의 추가/삭제가 용이하지만 데이터 탐색에서 불리함

  • 이진트리 기본 구조

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Node { 
	char data; 
	Node left;
	Node right;
	
	Node(char data){ 
		this.data = data;
	}
}

public class TreeOrder {
	public Node root;
	public void createNode( char data, char leftData, char rightData) {
		if(root==null) { 
			root = new Node(data);
			if(leftData != '.') {  root.left = new Node(leftData); }
			if(rightData != '.') {  root.right = new Node(rightData); }
			
		} else { 
			searchNode(root, data, leftData, rightData);
		}
	}

	static public void searchNode(Node node, char data, char leftData, char rightData) { 
		if(node==null) {
			return;
		}else if (node.data==data) {
			if(leftData != '.') {  node.left = new Node(leftData); }
			if(rightData != '.') {  node.right = new Node(rightData); }
		}else {
			searchNode(node.left, data, leftData, rightData); //왼쪽 재귀 탐색
			searchNode(node.right, data, leftData, rightData); //오른쪽 재귀 탐색
		}
	}
	
	//전위순회
	public void preOrder(Node node) { 
		if(node != null) {
			System.out.print(node.data);
			if(node.left != null) { preOrder(node.left);  }
			if(node.right != null) { preOrder(node.right);  }
		}
	}
	
	//중위순회
	public void inOrder(Node node) {
		if(node != null) {
			if(node.left != null) { inOrder(node.left);  }
			System.out.print(node.data);
			if(node.right != null) { inOrder(node.right);  }
		}
	}
	
    //후위순회
	public void postOrder(Node node) {
		if(node != null) {
			if(node.left != null) { postOrder(node.left);  }
			if(node.right != null) { postOrder(node.right);  }
			System.out.print(node.data);
		}
	}
	
	public static void main(String[] args) throws IOException {
		//1991
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		TreeOrder t = new TreeOrder();
		String str = "";
		
		int N = Integer.parseInt(br.readLine());
		for (int i=0; i<N; i++) {
			str = br.readLine();
			t.createNode(str.charAt(0), str.charAt(2), str.charAt(4));
		}
		t.preOrder(t.root);	
		System.out.println();
		t.inOrder(t.root);	
		System.out.println();
		t.postOrder(t.root);	
	}
}

0개의 댓글