[문제보기]
1991. 트리 순회
[풀이과정]
이 문제는 트리 문제 중 기본적인 문제로 이진 트리만 형성을 해주고나서 cout 해주는 부분을 첫번째, 두번째, 세번째에
넣느냐에 따라 전위, 중위, 후위가 나오는 문제이다.
1번째 코드는 배열을 사용하여 트리를 만든 코드이고,
2번째 코드는 class와 포인터를 사용하여 만든 코드이다.
[소스코드]
#include <iostream>
using namespace std;
int tree[26][2];
int n;
void preorder(int node){
if(node == -1) return;
cout << char(node+'A');
preorder(tree[node][0]);
preorder(tree[node][1]);
}
void inorder(int node){
if(node == -1) return;
inorder(tree[node][0]);
cout << char(node+'A');
inorder(tree[node][1]);
}
void postorder(int node){
if(node == -1) return;
postorder(tree[node][0]);
postorder(tree[node][1]);
cout << char(node+'A');
}
int main(){
cin >> n;
for(int i=0; i<n; i++){
char root, left, right;
cin >> root >> left >> right;
tree[(int)(root-'A')][0] = left != '.' ? left-'A' : -1;
tree[(int)(root-'A')][1] = right != '.' ? right-'A' : -1;
}
preorder(0);
cout << "\n";
inorder(0);
cout << "\n";
postorder(0);
cout << "\n";
return 0;
}
class 사용
#include <iostream>
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;
tree[(int)(data-'A')].SetData(data);
if(left != '.')
tree[(int)(data-'A')].SetLeft(&tree[(int)(left-'A')]);
else
tree[(int)(data-'A')].SetLeft(NULL);
if(right != '.')
tree[(int)(data-'A')].SetRight(&tree[(int)(right-'A')]);
else
tree[(int)(data-'A')].SetRight(NULL);
}
Tree *root = &tree[0];
Tree::preorder(root);
cout << "\n";
Tree::inorder(root);
cout << "\n";
Tree::postorder(root);
cout << "\n";
}
[해결 과정 중 실수한 부분]
'알고리즘 스터디 > Beakjoon' 카테고리의 다른 글
[백준 2606][C++] 바이러스 (Silver 3) (0) | 2020.09.28 |
---|---|
[백준 11725][C++] 트리의 부모 찾기 (Silver 2) (0) | 2020.09.28 |
[백준 3687][C++] 성냥개비 (Gold 2) (0) | 2020.09.26 |
[백준 17070][C++] 파이프 옮기기 1 (Gold 5) (0) | 2020.09.26 |
[백준 1987][C++] 알파벳 (Gold 4) (0) | 2020.09.22 |