-
백준 1991 트리 순회 [C++]알고리즘 2018. 11. 25. 21:19
문제 링크 : https://www.acmicpc.net/problem/1991
소스코드
#include <iostream>#include <string>using namespace std;class Tree {string data;Tree *left, *right;public:Tree() { data = ""; left = NULL; right = NULL; }void setData(char data) { this->data = data; }void setLeft(Tree *left) { this->left = left; }void setRight(Tree *right) { this->right = right; }void static preorder(Tree *root) { // 전위if (root) {cout << root->data;preorder(root->left);preorder(root->right);}}void static inorder(Tree *root) { // 중위if (root) {inorder(root->left);cout << root->data;inorder(root->right);}}void static postorder(Tree *root) { // 후위if (root) {postorder(root->left);postorder(root->right);cout << root->data;}}};int main() {int n;cin >> n;Tree *tree = new Tree[n];for (int i = 0; i < n; ++i) {char data,left,right;cin >> data>>left>>right;if(data!='.')tree[(int)(data-'A')].setData(data);if (left != '.')tree[(int)(data - 'A')].setLeft(&tree[(int)(left - 'A')]);elsetree[(int)(data - 'A')].setLeft(NULL);if (right != '.')tree[(int)(data - 'A')].setRight(&tree[(int)(right - 'A')]);elsetree[(int)(data - 'A')].setRight(NULL);}Tree *root = &tree[0];//cout << "전위 순회 : ";Tree::preorder(root);cout << endl;//cout << "중위 순회 : ";Tree::inorder(root);cout << endl;//cout << "후위 순회 : ";Tree::postorder(root);cout << endl;}이 문제의 트리는 이진트리입니다.
이진 트리는 한 노드에 왼쪽 자식과 오른쪽 자식이 있는 트리입니다.
전위 순회는 루트노드- 왼쪽 자식- 오른쪽 자식 순서로 방문합니다.
중위 순회는 왼쪽 자식 - 루트 노드 - 오른쪽 자식 순서로 방문합니다.
후위 순회는 왼쪽 자식 - 오른쪽 자식 - 루트 노드 순서로 방문합니다.
예를 들어 전위 순회에서는 루트 노드를 방문 후, 왼쪽 자식이 없을 때 까지 내려갔다가 왼쪽 자식의 끝을 방문하면 다시 올라와 오른쪽 자식을 방문합니다.
Tree 클래스를 만들어 각 알파벳에 해당하는 인덱스에 노드를 만들었습니다.
'알고리즘' 카테고리의 다른 글
백준 1874 스택 수열 [C++] (0) 2018.11.25 백준 5639 이진 검색 트리 [C++] (0) 2018.11.25 백준 9012 괄호 [C++] (0) 2018.11.25 백준 1260 DFS와 BFS [C++] (0) 2018.11.25 백준 10828 스택 [C++] (0) 2018.11.25