백준_1991_트리 순회

임정민·2023년 5월 11일
2

알고리즘 문제풀이

목록 보기
42/173
post-thumbnail

'Do it 자료구조와 함께 배우는 알고리즘 입문' 도서를 토대로 공부하고 관련한 문제를 찾아풀어보고 있습니다.

'이진 트리' 자료구조 문제 풀이입니다!!!

문제

https://www.acmicpc.net/problem/1991

[나의 풀이]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

// 노드 클래스
class Node {
	
    // 노드의 데이터
    String data;
    
    // 왼쪽 노드
    Node left;
    
    // 오른쪽 노드
    Node right;

    Node (String data){
        this.data = data;
    }

}

// 이진 트리 클래스
class BinaryTree {
	
    // 최상위 루트 : root
    Node root;
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	// 새 노드 생성
    void createNode(String data, String leftdata, String rightdata){
		
        // root가 비어있으면 root에 삽입
        if (root == null)
        {
            root = new Node(data);  
            if (!leftdata.equals(".")){
                root.left = new Node(leftdata);
            }
            if (!rightdata.equals(".")){
                root.right = new Node(rightdata);
            }

        }
        // root가 비어있지 않다면 어떤 노드에 삽입할지 탐색
        else {
            searchNode(root, data, leftdata, rightdata);
        }
    }
	
    // 삽입할 노드 위치 탐색
    void searchNode(Node node, String data, String leftdata, String rightdata){
		
        // 삽입할 위치가 없으면 return
        if (node == null){

            return;

        }
        
        // 삽입할 위치를 찾으면 노드 삽입
        else if (node.data.equals(data)){

            if (!leftdata.equals(".")){
                node.left = new Node(leftdata);
            }
            if (!rightdata.equals(".")){
                node.right = new Node(rightdata);
            }
        }
        else{
			
            // 왼쪽 탐색
            searchNode(node.left, data, leftdata, rightdata);
            // 오른쪽 탐색
            searchNode(node.right, data, leftdata, rightdata);

        }

    }
	
    // 전위 탐색
    // root - left - right
    void preOrder(Node node) throws IOException{
        
        if (node != null){
            bw.write(node.data+"");
            bw.flush();
            if (node.left != null){
                preOrder(node.left);
            }
            if (node.right != null){
                preOrder(node.right);
            }
        }

    }
	
    // 중위 탐색
    // left - root -right
    void inOrder(Node node) throws IOException{

        if (node != null){

            if (node.left != null){
                inOrder(node.left);
            }
            bw.write(node.data+"");
            bw.flush();
            if (node.right != null){
                inOrder(node.right);
            }
        }

    }
	
    // 후위 탐색
    // left - right - root
    void postOrder(Node node) throws IOException{

        if (node != null){
            
            if(node.left != null){
                postOrder(node.left);
            }
            if(node.right != null){
                postOrder(node.right);
            }
            bw.write(node.data+"");
            bw.flush();
        }

    }

}


public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());

        BinaryTree binaryTree = new BinaryTree();
        
        String a;
        String b;
        String c;

        for (int i=0; i<N; i++){
            
            st = new StringTokenizer(br.readLine());
            a = st.nextToken();
            b = st.nextToken();
            c = st.nextToken();
            binaryTree.createNode(a, b, c);
        }

        binaryTree.preOrder(binaryTree.root);
        bw.write("\n");
        bw.flush();
        binaryTree.inOrder(binaryTree.root);
        bw.write("\n");
        bw.flush();
        binaryTree.postOrder(binaryTree.root);

    }
}

이진 트리 구조에서의 전위 순회, 중위 순회, 후위 순회 문제입니다. 노드 클래스, 이진 트리 클래스를 정의하여 이진 트리 자료구조를 구현하였습니다. 또한 root -left-right 순으로 순회하는 전위 순회, left-root-right 순으로 순회하는 중위 순회, left-right-root 순으로 순회하는 후위 순회 메소드들을 구현하여 해결하였습니다. 🐇🐇🐇

감사합니다.🏃🏃🏃

profile
https://github.com/min731

1개의 댓글

comment-user-thumbnail
2023년 5월 17일

🍀

답글 달기