특정 목적을 위해 트리의 모든 노드를 한번씩 방문하는 것을 트리 순회라고한다.
트리 구조는 계층적 구조이기 때문에, 모든 노드를 순회하는 방법엔 크게 3가지가 있다.
(순회 방식과는 논외로, 트리 구조에서 노드를 순차적으로 조회할 때는 항상 왼쪽부터 오른쪽 순서로 한다. )

class Node {
String data;
Node left;
Node right;
public Node getLeft() {
return left;
}
public String getData() {
return data;
}
public Node getRight() {
return right;
}
}
public ArrayList<String> preOrder(Node node, ArrayList<String> list) {
if (node != null) {
list.add(node.getData());
list = preOrder(node.getLeft(), list);
list = preOrder(node.getRight(), list);
}
return list;
}
탐색 종료 시 list의 값 -> ["A", "B", "D", "H", "I", "E", "J", "K", "C", "F", "L", "M", "G", "N", "O"]

/* 최소한의 기능만 구현되어 있습니다.
자식 노드가 없는 경우는 node == null이라고 가정합니다.
이미 이진 트리는 구현되어 있다고 가정합니다. */
class Node {
String data;
Node left;
Node right;
public Node getLeft() {
return left;
}
public String getData() {
return data;
}
public Node getRight() {
return right;
}
}
public ArrayList<String> inOrder(Node node, ArrayList<String> list) {
if (node != null) {
list = inOrder(node.getLeft(), list);
list.add(node.getData());
list = inOrder(node.getRight(), list);
}
return list;
}
탐색 종료 시 list의 값 -> ["H", "D", "I", "B", "E", "J", "K", "A", "L", "F", "M", "C", "N", "G", "O"]

/* 최소한의 기능만 구현되어 있습니다.
자식 노드가 없는 경우는 node == null이라고 가정합니다.
이미 이진 트리는 구현되어 있다고 가정합니다. */
class Node {
String data;
Node left;
Node right;
public Node getLeft() {
return left;
}
public String getData() {
return data;
}
public Node getRight() {
return right;
}
}
public ArrayList<String> postOrder(Node node, ArrayList<String> list) {
if (node != null) {
list = postOrder(node.getLeft(), list);
list = postOrder(node.getRight(), list);
list.add(node.getData());
}
return list;
}
탐색 종료 시 list의 값 -> ["H", "I", "D", "J", "K", "E", "B", "L", "M", "F", "N", "O", "G", "C", "A"]