#include<iostream>
#include<queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
private:
queue<TreeNode*> q;
public:
void run(TreeNode* root) {
//DFS
preOrder(root);
cout << endl;
inOrder(root);
cout << endl;
postOrder(root);
cout << endl;
//BFS
bfs(root);
}
//전위탐색
void preOrder(TreeNode* root) {
cout << root->val << "\n";
if (root->left != NULL) {
preOrder(root->left);
}
if (root->right != NULL) {
preOrder(root->right);
}
}
//중위탐색
void inOrder(TreeNode* root) {
if (root->left != NULL) {
preOrder(root->left);
}
cout << root->val << "\n";
if (root->right != NULL) {
preOrder(root->right);
}
}
//후위탐색
void postOrder(TreeNode* root) {
if (root->left != NULL) {
preOrder(root->left);
}
if (root->right != NULL) {
preOrder(root->right);
}
cout << root->val << "\n";
}
//깊이우선탐색
void bfs(TreeNode* root) {
TreeNode* tmp;
int startPnt = 0;
tmp = root;
q.push(tmp);
while (!q.empty()) {
tmp = q.front();
int front = q.front()->val;
q.pop();
cout << front << "\n";
if (tmp->left != nullptr) {
q.push(tmp->left);
}
if (tmp->right != nullptr){
q.push(tmp->right);
}
}
delete tmp;
}
};