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 한국교통대 김지훈
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
12 | Java 기초 - Parameter를 가진 메쏘드의 선언 | Eugene | 2025.04.16 | 34 |
11 | Java 기초 - 메쏘드를 가진 클래스의 선언과 클래스의 객체를 예시화(instantiate)하기 | Eugene | 2024.03.25 | 59 |
10 | Java Heap Sort(힙 정렬) | Eugene | 2022.04.12 | 309 |
9 | Java Max Heap(자바 맥스 힙) | Eugene | 2021.09.16 | 221 |
8 | Java - Binary Tree(자바 이진 트리) | Eugene | 2021.08.17 | 276 |
» | Java Tree(자바 트리) - 자식 노드들을 리스트 자료구조를 사용하여 구현 | Eugene | 2021.04.01 | 2539 |
6 | JAVA Linked List(링크드 리스트) [1] | Eugene | 2021.02.09 | 792 |
5 | Java 기초 - 재귀 함수를 이용한 최대값 구하기 | Eugene | 2019.05.14 | 1101 |
4 | Java 기초 - while, for [2] | Eugene | 2018.04.05 | 860 |
3 | Java 기초 - 조건문 if | Eugene | 2017.11.03 | 757 |
2 | Java 기초 - 두 정수 입력 받아 합 구하기 | Eugene | 2017.11.01 | 3771 |
1 | Java 기초 - Hello, World! | Eugene | 2017.09.27 | 1780 |