[ 연습용 코드 ]
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
struct TreeNode
{
	int val;
	TreeNode* left = nullptr;
	TreeNode* right = nullptr;
	TreeNode() : val(0) {}
	TreeNode(int x) : val(x) {}
	TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) { }
};
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root)
    {
    }
};
int main()
{
	
	TreeNode n3(3, nullptr, nullptr);
	TreeNode n4(4, nullptr, nullptr);
	TreeNode n2(2, &n3, &n4);
	TreeNode n5(5, nullptr, nullptr);
	TreeNode n1(1, &n2, &n5);
	Solution s;
	vector<int> result = s.preorderTraversal(&n1); // [1 2 3 4 5]
	return 0;
}
 
 
[ Pre-order : 재귀버전 ]
class Solution {
public:
	vector<int> result;
	vector<int> preorderTraversal(TreeNode* root)
	{
		if (root == nullptr)
			return result;
		result.push_back(root->val);
		preorderTraversal(root->left);
		preorderTraversal(root->right);
		return result;
	}
};
 
[ Pre-order : 반복문 버전 ]
class Solution {
public:
	vector<int> preorderTraversal(TreeNode* root)
	{
		stack<TreeNode*> s;
		vector<int> result;
		if (root == nullptr)
			return result;
		s.push(root);
		TreeNode* now = nullptr;
		while (s.empty() == false)
		{
			now = s.top();
			s.pop();
			result.push_back(now->val);
			// LIFO 이므로 right를 먼저 넣는다.
			if (now->right) s.push(now->right);
			if (now->left) s.push(now->left);
		}
		return result;
	}
};