1 분 소요

// 트리의 노드가 될 객체 구현
class Node {
    char data;
    Node left;
    Node right;

    public Node(char data, Node left, Node right) {
        this.data = data;
        this.left = left;
        this.right = right;
    }
}
// 트리 클래스에는 부모노드인 head 추가
class BinaryTree {
    Node head;

    BinaryTree() {} // 기본 생성자
    BinaryTree(char[] arr) { // 문자배열 길이만큼 노드배열 생성
        Node[] nodes = new Node[arr.length];
        for (int i = 0; i < arr.length; i++) {
            nodes[i] = new Node(arr[i], null, null); // 데이터 입력
        }
        // 이진트리기 때문에 leftIdx, rightIdx는 노드배열에서 각 노드의 *2 +@ 인덱스로 표현됨.
        for (int i = 0; i < arr.length; i++) {
            int leftIdx = 2 * i + 1;
            int rightIdx = 2 * i + 2;
            // 배열을 벗어나지 않는 범위내에서. 즉, 자식노드가 있으면
            if(leftIdx < arr.length) {
                nodes[i].left = nodes[leftIdx];
            }

            if(rightIdx < arr.length) {
                nodes[i].right = nodes[rightIdx];
            }
        }
        this.head = nodes[0]; // 헤드는 노드0번으로 지정. (루트 노드)
    }
    // [ 프리오더 ]
    // A B D H I E J C F G
    public void preOrder(Node node) {
        if (node == null) {
            return;
        }

        System.out.print(node.data + " "); // 출력하고 자식노드로 내려감
        this.preOrder(node.left);
        this.preOrder(node.right);
    }
    // [ 인오더 ]
    // H D I B J E A F C G
    public void inOrder(Node node) {
        if (node == null) {
            return;
        }

        this.inOrder(node.left);
        System.out.print(node.data + " "); // 왼쪽 자식노드가 없을 때부터 출력
        this.inOrder(node.right);
    }
    // [ 포스트 오더 ]
    // H I D J E B F G C A
    public void postOrder(Node node) {
        if (node == null) {
            return;
        }

        this.postOrder(node.left);
        this.postOrder(node.right);
        System.out.print(node.data + " "); // 오른쪽 자식노드가 없을 때부터 출력
    }
    // [ 레벨 오더 ]
    // A B C D E F G H I J
    public void levelOrder(Node node) {
        // 트리의 레밸 순서로 출력해야 하니 해당 레밸의 노드를 큐에 넣어줌
        Queue<Node> queue = new LinkedList<>();
        queue.add(node);
        // 큐가 빌때까지
        while(!queue.isEmpty()) {
            // 큐에서 하나씩 꺼냄
            Node cur = queue.poll();
            // 출력
            System.out.print(cur.data + " ");
            // 왼쪽, 오른쪽 노드가 있을때마다 큐에 하나씩 추가
            if(cur.left != null) {
                queue.offer(cur.left);
            }
            if(cur.right != null) {
                queue.offer(cur.right);
            }
            // 이렇게 되면 같은 레밸 노드가 모두 꺼내지고 나서
            // 그 다음 레밸 노드들이 순차적으로 나오게 됨
        }
    }
}

마지막 수정일시: 2022-06-12 12:21

댓글남기기