자바를 이용하여 트리를 생성하고 전위순회, 중위순회, 후위순회, 레벨순회를 하는 방법에 대해 알아보자 ❗
import java.util.LinkedList;
import java.util.Queue;
class Node{
private int data;
private Node left;
private Node right;
public Node(int data) {
this.data = data;
}
public Node(int data, Node left, Node right) {
this.data = data;
this.left = left;
this.right = right;
}
public int getData() {
return data;
}
public Node getLeftNode() {
return left;
}
public void setLeftNode(Node node) {
this.left = node;
}
public Node getRightNode() {
return right;
}
public void setRightNode(Node node) {
this.right = node;
}
}
class Tree{
private Node root;
public Node createNode(int data, Node left, Node right) {
root = new Node(data);
root.setLeftNode(left);
root.setRightNode(right);
return root;
}
}
public class Main {
public static void main(String[] args) {
// 1. 트리를 생성한다.
Tree tree = new Tree();
// 2. 노드를 tree에 연결시킨다.
Node n2 = tree.createNode(2, null, null);
Node n5 = tree.createNode(5, null, null);
Node n13 = tree.createNode(13, null, null);
Node n4 = tree.createNode(4, n2, n5);
Node n15 = tree.createNode(15, n13, null);
Node n9 = tree.createNode(9, n4, n15);
}
}
package com.ssafy.tree;
import java.util.LinkedList;
import java.util.Queue;
class Node{
private int data;
private Node left;
private Node right;
public Node(int data) {
this.data = data;
}
public Node(int data, Node left, Node right) {
this.data = data;
this.left = left;
this.right = right;
}
public int getData() {
return data;
}
public Node getLeftNode() {
return left;
}
public void setLeftNode(Node node) {
this.left = node;
}
public Node getRightNode() {
return right;
}
public void setRightNode(Node node) {
this.right = node;
}
}
class Tree{
private Node root;
public Node createNode(int data, Node left, Node right) {
root = new Node(data);
root.setLeftNode(left);
root.setRightNode(right);
return root;
}
// 1. 전위순회(root → Left → Right)
public void preOrder(Node node) {
if(node != null) {
System.out.print(node.getData()+" ");
preOrder(node.getLeftNode());
preOrder(node.getRightNode());
}
}
// 2. 중위순회(Left → root → Right)
public void inOrder(Node node) {
if(node != null) {
inOrder(node.getLeftNode());
System.out.print(node.getData()+" ");
inOrder(node.getRightNode());
}
}
// 3. 후위순회(Left → Right → root)
public void postOrder(Node node) {
if(node != null) {
postOrder(node.getLeftNode());
postOrder(node.getRightNode());
System.out.print(node.getData()+" ");
}
}
// 4. 레벨순회(각 노드 레벨의 순서에 따라 순회하는 방법)
public void levelOrder(Node node) {
Queue<Node> queue = new LinkedList<>();
queue.offer(node);
Node tempNode;
while(!queue.isEmpty()) {
tempNode = queue.poll();
System.out.print(tempNode.getData()+" ");
if(tempNode.getLeftNode() != null) queue.offer(tempNode.getLeftNode());
if(tempNode.getRightNode() != null) queue.offer(tempNode.getRightNode());
}
}
}
public class Main {
public static void main(String[] args) {
// 1. 트리를 생성한다.
Tree tree = new Tree();
// 2. 노드를 tree에 연결시킨다.
Node n2 = tree.createNode(2, null, null);
Node n5 = tree.createNode(5, null, null);
Node n13 = tree.createNode(13, null, null);
Node n4 = tree.createNode(4, n2, n5);
Node n15 = tree.createNode(15, n13, null);
Node n9 = tree.createNode(9, n4, n15);
// 전위순회, 중위순회, 후위순회, 레벨순회로 노드의 데이터를 탐색한다.
System.out.println("1. 전위순회(root → Left → Right)");
tree.preOrder(n9);
System.out.println("\n2. 중위순회(Left → root → Right)");
tree.inOrder(n9);
System.out.println("\n3. 후위순회(Left → Right → root)");
tree.postOrder(n9);
System.out.println("\n4. 레벨순회(각 노드 레벨의 순서에 따라 순회하는 방법)");
tree.levelOrder(n9);
}
}
📌 결과
package com.ssafy.tree;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Node{
private int data;
private Node left;
private Node right;
public Node(int data) {
this.data = data;
}
public Node(int data, Node left, Node right) {
this.data = data;
this.left = left;
this.right = right;
}
public int getData() {
return data;
}
public Node getLeftNode() {
return left;
}
public void setLeftNode(Node node) {
this.left = node;
}
public Node getRightNode() {
return right;
}
public void setRightNode(Node node) {
this.right = node;
}
}
class Tree{
private Node root;
public Node createNode(int data, Node left, Node right) {
root = new Node(data);
root.setLeftNode(left);
root.setRightNode(right);
return root;
}
// 5. 스택을 사용한 중위순회(Left → root → Right)
public void stackinOrder(Node node) {
Stack<Node> stack = new Stack<>();
while(node != null || !stack.isEmpty()) {
while(node != null) {
stack.push(node);
node = node.getLeftNode();
}
node = stack.pop();
System.out.print(node.getData()+" ");
node = node.getRightNode();
}
}
}
public class Main {
public static void main(String[] args) {
Tree tree = new Tree();
Node n2 = tree.createNode(2, null, null);
Node n5 = tree.createNode(5, null, null);
Node n13 = tree.createNode(13, null, null);
Node n4 = tree.createNode(4, n2, n5);
Node n15 = tree.createNode(15, n13, null);
Node n9 = tree.createNode(9, n4, n15);
System.out.println("\n\n5. 스택을 사용한 중위순회(Left → root → Right)");
tree.stackinOrder(n9);
}
}
📌 결과