이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진 트리이다.
예를 들어, 위의 이진 검색 트리의 전위 순회 결과는 50 30 24 5 28 45 98 52 60 이고, 후위 순회 결과는 5 28 24 45 30 60 52 98 50 이다.
이진 검색 트리를 전위 순회한 결과가 주어졌을 때, 이 트리를 후위 순회한 결과를 구하는 프로그램을 작성하시오.
[입력 조건]
트리를 구성하는 노드 클래스
class Node {
private int data;
private Node lNode;
private Node rNode;
public int getData() {
return data;
}
public Node getlNode() {
return lNode;
}
public Node getrNode() {
return rNode;
}
public void setlNode(Node node) {
this.lNode = node;
}
public void setrNode(Node node) {
this.rNode = node;
}
public Node(int data) {
this.data = data;
setlNode(null);
setrNode(null);
}
}
트리를 구성하는 트리 클래스
class Tree {
Node root;
void createNode(int data) {
if (root == null) {
root = new Node(data);
root.setlNode(null);
root.setrNode(null);
} else {
traversalNode(root, data);
}
}
void traversalNode(Node node, int data) {
if (node.getData() < data) {
if (node.getrNode() == null) {
node.setrNode(new Node(data));
} else {
traversalNode(node.getrNode(), data);
}
} else {
if (node.getlNode() == null) {
node.setlNode(new Node(data));
} else {
traversalNode(node.getlNode(), data);
}
}
}
void postOrderTraversal(Node node) {
if (node != null) {
if (node.getlNode() != null) postOrderTraversal(node.getlNode());
if (node.getrNode() != null) postOrderTraversal(node.getrNode());
System.out.println(node.getData());
}
}
}
위에서 만든 클래스들을 구동시키는 메인 클래스
public class Main {
public static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
Tree tree = new Tree();
//System.out.println("전위 순회 방식으로 정렬한 노드들의 데이터를 입력합니다.");
while (true) {
String data = bufferedReader.readLine();
if (!isNumber(data)) {
break;
}
int intData = Integer.parseInt(data);
tree.createNode(intData);
}
tree.postOrderTraversal(tree.root);
bufferedReader.close();
}
public static boolean isNumber(String str) {
try {
int data = Integer.parseInt(str);
return true;
} catch (Exception e) {
return false;
}
}
}