각종 학습 요약/DataStructure

자료구조 - Tree와 순회, 코드로 알아보기

닉Nick 2022. 5. 28. 20:35

자료구조 - Tree와 순회 구현

지난 포스트에서는 binary tree에 대한 기본 개념을 익혀보았습니다.
이번 포스트에서는 Java를 이용해서 지난번 설명한 개념을 토대로 구현해보도록 하겠습니다.

Tree - 구현된 코드 살펴보기


👇Node를 구현한 Class와 설명

하나의 node는 자기 자신(의 데이터), 그리고 child node-left & right의 정보를 가지고 있습니다.
자식이 부모를 기억하거나, 자식과 부모가 서로를 참조하고 있거나 할 수도 있는데 일단 여기서는 parent node가 child node를 갖고 있는 걸로 간단하게 구현해보았어요.

class Node<T> {
    T data;
    Node left;
    Node right;
}
👇Tree를 구현한 코드와 설명

Tree는 Node들을 갖습니다. Tree의 node를 생성할 수 있도록 해주어야겠죠(makeNode()).
그리고 탐색하면서 콘솔에 출력하도록 세 가지 동작을 구현해보았습니다.
중위(inorderedPrint()), 전위(preorderedPrint()), 후위(postorderedPrint())의 세가지입니다.
순회 방식에 따라서, 자기 자신을 출력하는 것, 왼쪽 child node를 재귀적으로 탐색하는 것, 오른쪽 child node를 재귀적으로 탐색하는 것을 순서에 맞게 실행합니다.

class Tree<T> {
    public Node root;

    public Node makeNode(Node left, T data, Node right) {
        Node node = new Node();
        node.data = data;
        node.left = left;
        node.right = right;
        return node;
    }

    public void inorderedPrint(Node node) {
        if (node != null) {
            inorderedPrint(node.left);
            System.out.print(node.data + "  ");
            inorderedPrint(node.right);
        }
    }

    public void preorderedPrint(Node node) {
        if (node != null) {
            System.out.print(node.data + "  ");
            preorderedPrint(node.left);
            preorderedPrint(node.right);
        }
    }

    public void postorderedPrint(Node node) {
        if (node != null) {
            postorderedPrint(node.left);
            postorderedPrint(node.right);
            System.out.print(node.data + "  ");
        }
    }
}
👇구현된 결과를 확인해보기

TreeImpl이라는 클래스를 하나 만들어서, main() 메서드에서 확인해보았어요.
맨 위 주석에 나와있는 형태의 트리를 만든 것이고요.
그 아래에서 순회를 해보고 있습니다. 각 출력된 결과는 옆에 주석으로 붙여놓았는데요. 잘 출력되었죠?

public class TreeImpl {

    public static void main(String[] args) {
        /*
        *         1
        *     2        3
        * 4      5  6
        * */
        Tree<Integer> tree = new Tree<>();
        Node node4 = tree.makeNode(null, 4, null);
        Node node5 = tree.makeNode(null, 5, null);
        Node node2 = tree.makeNode(node4, 2, node5);
        Node node6 = tree.makeNode(null, 6, null);
        Node node3 = tree.makeNode(node6, 3, null);
        Node node1 = tree.makeNode(node2, 1, node3);

        /* 순회해보기 */
        tree.inorderedPrint(node1); // 출력 결과 : 4  2  5  1  6  3
        System.out.println();
        tree.postorderedPrint(node2); // 출력 결과 : 4  5  2
        System.out.println();
        tree.preorderedPrint(node3); // 출력 결과 : 3  6
    }

}

마무리


이렇게 해서 Tree와 tree를 구성하는 node, 그리고 순회 방식까지 더 잘 알아보았습니다.
Tree에서 어떤 노드가 Root인지 기억하는 속성을 추가한다면, 특별히 어떤 노드를 지정하지 않아도 root node부터 순회하도록 할 수 있겠죠. 직접 추가해보는 것도 좋을 것 같습니다.