이진트리의 전위순회, 중위순회, 후위순회를 구현하는 문제였다.
이진트리에서 노드는 자식노드를 가지고 있지 않더라도 공집합 노드를 가지고있는 하나의 이진트리라고 볼 수 있기 때문에 별도의 노드 구조체를 정의하지 않고, BTree 클래스를 정의하여 구현하였다.
#include <iostream>
using namespace std;
class BTree {
char data;
BTree* left;
BTree* right;
public:
BTree(char c) : data(c), left(NULL), right(NULL) { }
void makeLeftSubTree(BTree* sub) {
this->left = sub;
}
void makeRightSubTree(BTree* sub) {
this->right = sub;
}
void printData() {
cout << data;
}
BTree* findNode(char c) {
BTree* node = NULL;
if (this->data == c)
node = this;
if (left != NULL && node == NULL) node = left->findNode(c);
if (right != NULL && node == NULL) node = right->findNode(c);
return node;
}
void preorder() {
printData();
if(left != NULL) left->preorder();
if(right != NULL) right->preorder();
}
void inorder() {
if (left != NULL) left->inorder();
printData();
if (right != NULL) right->inorder();
}
void postorder() {
if (left != NULL) left->postorder();
if (right != NULL) right->postorder();
printData();
}
void deleteTree() {
if (left != NULL)
left->deleteTree();
if (right != NULL)
right->deleteTree();
delete this;
}
};
int main(void) {
int N;
cin >> N;
BTree* tree = new BTree('A');
for (int i = 0; i < N; i++) {
char parent, left, right;
cin >> parent >> left >> right;
if (left != '.') {
BTree* lNode = new BTree(left);
tree->findNode(parent)->makeLeftSubTree(lNode);
}
if (right != '.') {
BTree* rNode = new BTree(right);
tree->findNode(parent)->makeRightSubTree(rNode);
}
}
tree->preorder();
cout << '\n';
tree->inorder();
cout << '\n';
tree->postorder();
tree->deleteTree();
return 0;
}
'알고리즘 > BOJ' 카테고리의 다른 글
백준 13913번: 숨바꼭질 4 (0) | 2021.09.07 |
---|---|
백준 2638번: 치즈 (0) | 2021.09.07 |
백준 7425번: Flip Game (0) | 2021.04.22 |
백준 1766번: 문제집 (0) | 2021.04.22 |
백준 17142번: 연구소 3 (0) | 2021.04.21 |