이진트리를 만들고 순회하는 문제
Node
구조체를 만들어준다.data
, 위치값인 x
, y
, 왼쪽 자식 노드 포인터 left
와 오른쪽 자식 노드 포인터 right
Node
벡터를 만들어주고 초기화 해준 뒤, 정렬을 해주어야 함y
값으로 내림차순 정렬, x
값으로 오름차순 정렬해준다. 해당 커스텀 정렬 함수는 compare
0
번째 노드는 제일 위에 있는 노드이므로 root
가 된다. 1
번째 노드부터 부모에 연결해준다. 해당 함수는 setParent
parent
의 x
값이 해당 노드 x
값 보다 크다면 왼쪽에 있다는 것. 부모의 왼쪽 자식 노드가 NULL
이라면 해당 노드가 그 부모의 왼쪽 자식 노드가 된다. 이미 자식이 있다면 해당 왼쪽 자식 노드를 다시 부모로 재귀호출해준다. 오른쪽도 마찬가지로 진행해당노드
->왼쪽자식
->오른쪽자식
, 후위순회는 왼쪽자식
->오른쪽자식
->해당노드
순이 된다. 해당 노드일 때는 data
값을 넣고, 자식 노드일 때는 재귀호출 해주면 된다. 물론 NULL
체크도 해줘야 널 익셉션이 안뜸#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct Node
{
int data;
int x, y;
Node* left;
Node* right;
Node(int _data, int _x, int _y) : data(_data), x(_x), y(_y)
{
left = NULL;
right = NULL;
}
};
bool compare(Node a, Node b)
{
if (a.y == b.y) return a.x < b.x;
else return a.y > b.y;
}
void setParent(Node* parent, Node* node)
{
if (parent->x > node->x) // 왼쪽에 있음
{
if (parent->left == NULL)
{
parent->left = node;
return;
}
setParent(parent->left, node);
}
else // 오른쪽에 있음
{
if (parent->right == NULL)
{
parent->right = node;
return;
}
setParent(parent->right, node);
}
}
void preorder(Node* root, vector<int> &pre)
{
pre.push_back(root->data);
if(root->left != NULL) preorder(root->left, pre);
if(root->right != NULL) preorder(root->right, pre);
}
void postorder(Node* root, vector<int> &post)
{
if(root->left != NULL) postorder(root->left, post);
if(root->right != NULL) postorder(root->right, post);
post.push_back(root->data);
}
vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
vector<vector<int>> answer;
vector<Node> tree;
for (int i = 0; i < nodeinfo.size(); i++)
{
tree.push_back({ i + 1, nodeinfo[i][0], nodeinfo[i][1] }); // x,y,인덱스
}
sort(tree.begin(), tree.end(), compare); // y 내림차순, x 오름차순 정렬
Node* root = &tree[0]; // 루트 노드
for (int i = 1; i < tree.size(); i++) // 트리 만들어주기
{
setParent(root, &tree[i]);
}
vector<int> answer1;
preorder(root, answer1);
vector<int> answer2;
postorder(root, answer2);
answer.push_back(answer1);
answer.push_back(answer2);
return answer;
}