티스토리 뷰
이 문제는 기본 트리구조를 생성하고 트리의 순회 방법인 전위, 중위, 후위 순회를 해보는 트리 자료구조의 기본 문제라고 볼 수 있다. 재귀를 사용하여 구현하였다.
트리는 다양한 방법으로 구현할 수 있다. 나의 경우 트리 클래스를 따로 만들어서 사용하였다. Node [] 배열로 만들어서 구현하는 방법도 존재한다.
문제풀이
-tree 자료구조에 입력받은 각 노드를 위치에 맞게 insert()한다.
-전위 순회(preOrder) : 루트 -> 왼쪽 자식 -> 오른쪽 자식
-중위 순회(inOrder) : 왼쪽 자식 -> 루트 -> 오른쪽 자식
-후위 순회(postOrder) : 왼쪽 자식 -> 오른쪽 자식 -> 루트
<루트의 순서로 기억하면 편하다>
-트리를 위의 순회 방법으로 돌면서 노드의 값을 출력한다.
package baekjoon;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Ex_1991 {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//트리 트리순회
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
Tree tree = new Tree();
while(n-- > 0) {
st = new StringTokenizer(br.readLine());
char node = st.nextToken().charAt(0);
char left = st.nextToken().charAt(0);
char right = st.nextToken().charAt(0);
tree.insert(node, left, right);
}
tree.preOrder(tree.root);
System.out.println();
tree.inOrder(tree.root);
System.out.println();
tree.postOrder(tree.root);
}
}
class NodeT{
char data;
NodeT left;
NodeT right;
NodeT(char data){
this.data = data;
}
}
class Tree{
NodeT root;
//root가 없으면 입력받은 NodeT를 root로 지정 후 리턴
//root가 존재한다면, 트리 탐색을 진행해서 적절한 위치에 삽입
void insert(char data, char leftData, char rightData){
if(root == null) {
if(data!='.')
root = new NodeT(data);
if(leftData!='.')
root.left = new NodeT(leftData);
if(rightData!='.')
root.right = new NodeT(rightData);
}else {
search(root,data,leftData,rightData);
}
}
//해당 data가 위치하는 곳(data가 서브트리의 root가 되는 위치)을 찾아 삽입
void search(NodeT root, char data, char leftData, char rightData) {
if(root == null)
return;
if(root.data == data) {
if(leftData!='.')
root.left = new NodeT(leftData);
if(rightData!='.')
root.right = new NodeT(rightData);
}else {
search(root.left,data,leftData,rightData);
search(root.right,data,leftData,rightData);
}
}
//루트 -> 왼-> 오
void preOrder(NodeT root) {
System.out.print(root.data);
if(root.left!=null)
preOrder(root.left);
if(root.right!=null)
preOrder(root.right);
}
//왼-> 루트-> 오
void inOrder(NodeT root) {
if(root.left!=null)
inOrder(root.left);
System.out.print(root.data);
if(root.right!=null)
inOrder(root.right);
}
//왼-> 오른-> 루트
void postOrder(NodeT root) {
if(root.left!=null)
postOrder(root.left);
if(root.right!=null)
postOrder(root.right);
System.out.print(root.data);
}
}
'CS공부 > 알고리즘&문제풀이' 카테고리의 다른 글
[백준 1992] 네트워크 연결(java)-최소 스패닝 트리(MST) (0) | 2021.05.18 |
---|---|
[백준 1717] 집합의 표현(java)-유니온 파인드(Union-Find,합집합) (0) | 2021.05.05 |
[백준 17136] 색종이 붙이기(java) (0) | 2021.04.15 |
[프로그래머스]2017카카오코드 본선 : 단체사진 찍기(java) (0) | 2021.02.18 |
[백준 10986] 나머지 합(java)-누적 합 (0) | 2021.02.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 채팅
- java
- 삼성 sw역량테스트
- SWEA
- 분리 집합
- git
- MST
- 최소 스패닝 트리
- 삼성 sw역량 테스트
- programers
- Spring
- BFS
- 완전탐색
- websocket
- sockjs
- 운영체제
- Heap
- JavaScript
- 코딩테스트
- 정렬
- Baekjoon
- 알고리즘
- 자바
- 프로그래머스
- OS
- Stomp
- dfs
- DP
- 백준
- Oracle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함