728x90
https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
📌 내 풀이
import java.util.Arrays;
import java.util.Optional;
import java.util.Scanner;
import java.util.stream.Stream;
public class Prac {
static StringBuilder sb;
static String[] sArr;
static int idx= 3;
static Node[] nodeArr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = Integer.parseInt(sc.nextLine());
sb = new StringBuilder(T);
nodeArr = new Node[T+1];
sArr = sc.nextLine().split(" ");
Arrays.fill(nodeArr, new Node(""));
Node root = new Node(sArr[0]);
nodeArr[0] = root;
if(!".".equals(sArr[1])) {
nodeArr[1] = root.lt = new Node(sArr[1]);
}
if(!".".equals(sArr[2])) {
nodeArr[2] = root.rt = new Node(sArr[2]);
}
for(int i=0; i<T-1; i++) {
sArr = sc.nextLine().split(" ");
Optional<Node> rootNode = checkSameAndReturnOptiNode(sArr[0]);
if(!".".equals(sArr[1])) {
Optional<Node> leftNode = checkSameAndReturnOptiNode(sArr[1]);
rootNode.get().lt = leftNode.get();
}
if(!".".equals(sArr[2])) {
Optional<Node> rightNode = checkSameAndReturnOptiNode(sArr[2]);
rootNode.get().rt = rightNode.get();
}
}
preOrder(root);
System.out.println(sb.toString());
sb.setLength(0);
inOrder(root);
System.out.println(sb.toString());
sb.setLength(0);
postOrder(root);
System.out.println(sb.toString());
}
static class Node{
String data;
Node lt, rt;
Node(String data) {
this.data = data;
}
public String toString() {
return data;
}
}
static void preOrder(Node root) {
if(root == null) {
return;
}
sb.append(root.data);
preOrder(root.lt);
preOrder(root.rt);
}
static void inOrder(Node root) {
if(root == null) {
return;
}
inOrder(root.lt);
sb.append(root.data);
inOrder(root.rt);
}
static void postOrder(Node root) {
if(root == null) {
return;
}
postOrder(root.lt);
postOrder(root.rt);
sb.append(root.data);
}
static Optional<Node> checkSameAndReturnOptiNode(String s) {
if(Stream.of(nodeArr).filter(x -> s.equals(x.data)).count()==0) {
nodeArr[idx++] = new Node(s);
}
Optional<Node> rootNode = Stream.of(nodeArr)
.filter(x -> s.equals(x.data))
.reduce((a, b) -> a);
return rootNode;
}
}
📌 참고할만한 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_1991 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static Node[] nodes;
public static void main(String[] args) throws NumberFormatException, IOException {
int N = Integer.parseInt(br.readLine());
nodes=new Node[N+1];
for(int i=1;i<=N;i++) {
nodes[i]=new Node((char)(i+64));
}
for(int i=1;i<=N;i++) {
String[] s=br.readLine().split(" ");
char idx = s[0].charAt(0);
char l = s[1].charAt(0);
char r = s[2].charAt(0);
if(l!='.') nodes[idx-'A'+1].Left=nodes[l-'A'+1];
if(r!='.') nodes[idx-'A'+1].Right=nodes[r-'A'+1];
}
preorder(nodes[1]);
sb.append("\n");
inorder(nodes[1]);
sb.append("\n");
postorder(nodes[1]);
sb.append("\n");
System.out.print(sb.toString());
}
static class Node{
char data;
Node Left;
Node Right;
public Node(char data) {
super();
this.data = data;
}
}
public static void preorder(Node node) {
sb.append(node.data);
if(node.Left!=null) preorder(node.Left);
if(node.Right!=null) preorder(node.Right);
}
public static void inorder(Node node) {
if(node.Left!=null) inorder(node.Left);
sb.append(node.data);
if(node.Right!=null) inorder(node.Right);
}
public static void postorder(Node node) {
if(node.Left!=null) postorder(node.Left);
if(node.Right!=null) postorder(node.Right);
sb.append(node.data);
}
}
728x90
'[알고리즘] > 알고리즘' 카테고리의 다른 글
[알고리즘] 백준 1182. 부분수열의 합 (0) | 2022.02.17 |
---|---|
[알고리즘] SW Expert Acadamy 5215. 햄버거 다이어트 (0) | 2022.02.17 |
[알고리즘] 백준 2309번 일곱 난쟁이 (0) | 2022.02.13 |
[알고리즘] SW Expert Academy 3499. 퍼펙트 셔플 (0) | 2022.02.13 |
[알고리즘] 백준 17478. 재귀함수가 뭔가요? (0) | 2022.02.13 |