메뉴 건너뛰기

package com.eugenecomputer.trees;

 

import java.util.ArrayList;

import java.util.List;

 

 

public class Node {

    private Object data;

    private ArrayList<Node> childNodes;

    private int level;

    private int degree;

    

    /**

     * 기본 생성자

     * childNodes 초기화

     */

    public Node() {

        childNodes = new ArrayList<Node>();

    }

    

    /**

     * 노드 생성시 노드의 값을 넣어 줌

     * @param data

     */

    public Node(Object data) {

        childNodes = new ArrayList<Node>();

        this.data = data;

    }

    

    /**

     * node의 값 설정

     * @param data

     */

    public void setData(Object data) {   

        this.data = data;

    }

    

    /**

     * 노드의 값 조회

     * @return Object

     */

    public Object getData() {

        return data;

    }

    

    /**

     * 설정 노드의 자식 노드 node 추가 후 노드의 크기 출력

     * @param node

     */

    public void addChildNode(Node node) {

        childNodes.add(node);

    }

    

    /**

     * 노드 제거 후 노드의 크기 출력

     * @param node

     */

    public void removeChild(Node node) {    

        childNodes.remove(node);

    }

    

    /**

     * tempNode노드를 null로 설정.

     * 정수 i는 0부터 childNodes의 크기전까지 1씩 증가하는데

     * 만약 childNodes의 값이 data와 같다면 tempNode에 i번째 childNodes노드 값을 대입시키고 중지시킨다

     * tempNode 값 반환

     * @param data

     * @return

     */

    public Node getNode(Object data) {

        Node tempNode = null;

 

        for (int i = 0; i < childNodes.size(); i++) {

            if (childNodes.get(i).getData().equals(data)) {

                tempNode = (Node) childNodes.get(i);

                break;

            }

        }

        

        return tempNode;

        

    }

        

    public void setLevel(int level) {

        this.level = level;

    }

    

    public int getLevel() {

        return level;

    }

    

    public void setDegree(int degree) {

        this.degree = degree;

    }

    

    public int getDegree() {

        return degree;

    }

    

    /*

     * childNodes의 해당 값을 한번 출력하고  " : (" 출력한 후, 

     * for 반복문에서 i는 0부터 childNodes의 크기 전까지 하나씩 증가하는데

     * 하나씩 증가할때마다 i번째 값을 한번 출력하고 띄어주는 것을 반복 후

     * ") " 출력.

     */

    public void printChildNodes() { 

        System.out.print(getData()+" : ( ");

        for (int i = 0; i < childNodes.size(); i++) {

            System.out.print(childNodes.get(i).getData());

            System.out.print(" ");

        }

        System.out.println(")");

    }

    

    /*

     * childNodes 값 반환.

     */

    public ArrayList<Node> getChildNodes() {

        return childNodes;

    }

 

    /**

     * 배열로 이루어진 childNodes노드에 node의 값들 대입.

     * 만약 childNodes가 값이 없거나, 크기가 0일 경우 마친다.

     * "( "출력 후, i가 0부터 childNodes의 크기전까지 1씩 증가하는데 

     * 이때 i번? childNodes값을 tempNode에 대입하고 값들이 출력 되며

     * 리컬시브로 다시 print(tempNode)로 tempNode는 i번? 노드의 자식노드를 대입 시킨 것이므로

     * 처음 printTree(A) 였으면 그 자식노드인 (B) 그 다음은 (E) 다음은 (K)로 내려가다가 노드의 자식노드가 없으면 반환하여

     * 다음 자식노드를 printTree() 해준 후 " )" 출력. 

     * ex) root의 경우 , A → B → E → K → L → F → C → G → D → H → M → I → J 순서로 출력

     * @param node

     * @return

    */

    public void printTree(Node node) {

        ArrayList<Node> childNodes = node.getChildNodes();

        

        if (null == childNodes || childNodes.size() == 0)

            return;

        System.out.print("( ");

        for (int i = 0; i < childNodes.size(); i++) {

            Node tempNode = childNodes.get(i);

            System.out.print((childNodes.get(i)).getData()+" ");

            printTree(tempNode);    

        }

        System.out.print(") ");

    }

    

    /**

     * 배열로 이루어진 노드 childNodes에 node의 자식노드를 대입

     * 만약 childNodes의 값이 없거나 크기가 0일 경우, null 반환

     * 정수 i가 0부터 childNodes의 크기전까지 1씩 증가하는데 이 과정에서 

     * tempNode노드에 i번째 childNodes의 값을 대입시킨다

     * 만약 tempNode의 값이  data와 동일하다면, node값 반환

     * 그러나 tempNode의 값이 data와 동일하지 않다면,리컬시브로 tn노드에 i번째 노드의 자식노드인 

     * tempNode를 getParentNode(tempNode, data) 삽입, 만약 tn의 값이 존재한다면 tn 반환. 

     * 마지막으로 null 반환.

     * @param node

     * @param data

     */

    public static Node getParentNode(Node node, Object data)    {

        ArrayList<Node> childNodes = node.getChildNodes();

        

        if(null == childNodes || childNodes.size() == 0)

            return null;

        

        for(int i = 0; i < childNodes.size(); i++)  {

            Node tempNode = childNodes.get(i);

            if(tempNode.getData().equals(data)) {

                return node;

            }

            else    {

                Node tn = getParentNode(tempNode, data);

                if(null != tn)

                    return tn;

            }

        }

        return null;

    }   

}

 

package com.eugenecomputer.trees;

 

public class TreeApps {

    public static void main(String[] args) {

        

        /**

         * 새로운 노드 root를 노드 A로 설정

         * root노드에 자식노드로 B, C, D노드 추가

         * root노드 출력

         */

        Node root = new Node("A");

        root.addChildNode(new Node("B"));

        root.addChildNode(new Node("C"));

        root.addChildNode(new Node("D"));

        root.printChildNodes();

        System.out.println();

        

        /**

         * 새로운 노드 temp에 root노드의 노드 B 설정

         * B노드에 자식노드로  E, F, G추가

         * temp노드 출력

         */

        Node temp = root.getNode("B");

        temp.addChildNode(new Node("E"));

        temp.addChildNode(new Node("F"));

        temp.addChildNode(new Node("G"));

        temp.printChildNodes(); 

        System.out.println();

        

        /**

         * 새로운 노드 tempNode에 temp노드의 노드 G 설정

         * temp노드의 tempNode인 G 노드를 삭제

         * temp노드 출력

         */

        Node tempNode = temp.getNode("G");

        temp.removeChild(tempNode);

        temp.printChildNodes();

        System.out.println();

        

        /**

         * 새로운 노드 temp1에 root노드의 노드 C 설정

         * C노드에 자식노드로 G 추가

         * temp1노드 출력

         */

        Node temp1 = root.getNode("C");

        temp1.addChildNode(new Node("G"));

        temp1.printChildNodes();    

        System.out.println();

        

        /**

         * 새로운 노드 temp2에 root노드의 노드 D 설정

         * D노드에 자식노드로 H, I, J추가

         * temp2노드 출력

         */

        Node temp2 = root.getNode("D");

        temp2.addChildNode(new Node("H"));

        temp2.addChildNode(new Node("I"));

        temp2.addChildNode(new Node("J"));

        temp2.printChildNodes();    

        System.out.println();

        

        /**

         * 새로운 노드 temp3에 root노드의 노드 E 설정  

         * E노드에 자식노드로 K, L추가

         * temp3노드 출력

         */

        Node temp3 = temp.getNode("E");

        temp3.addChildNode(new Node("K"));

        temp3.addChildNode(new Node("L"));

        temp3.printChildNodes();    

        System.out.println();

        

        /**

         * 새로운 노드 temp4에 root노드의 노드 H 설정

         * H노드에 자식노드로  M 추가

         * temp4노드 출력

         */

        Node temp4 = temp2.getNode("H");

        temp4.addChildNode(new Node("M"));

        temp4.printChildNodes();    

        System.out.println();

        

        /**

         * root의 값을 출력

         * 배열로 이루어진 root노드의 모든 노드들을 출력

         */

        System.out.print(root.getData() + " ");

        root.printTree(root);

        System.out.println();

        

        /**

         * tn노드에 노드 "G"의 부모노드 삽입

         * tn1노드에 tn노드의 자식노드 삽입

         * tn노드의 자식노드인 tn1노드 삭제

         * tn노드의 자식노드로 "Z"노드 추가

         */

        Node tn = Node.getParentNode(root, "G");

        Node tn1 = tn.getNode("G");

        tn.removeChild(tn1);

        

        /**

         * root의 값을 출력

         * 배열로 이루어진 root노드의 모든 노드들을 출력

         */

        System.out.print(root.getData() + " ");

        root.printTree(root);

        System.out.println();

        

        tn.addChildNode(new Node("Z"));

        

        /**

         * root의 값을 출력

         * 배열로 이루어진 root노드의 모든 노드들을 출력

         */

        System.out.print(root.getData() + " ");

        root.printTree(root);

        System.out.println();

    }

}

 

이 프로그램은 Node와 TreeApps로 구성되어 있다.

설명은 주석으로 대체한다.
 

by 한국교통대 김지훈