아주 기본적인 트리 구현 문제였다.
자료구조의 기본적인 감을 되찾기 위해 기본으로 돌아갔다.
가장 먼저, 어떤 방식으로 트리를 구현할 지가 처음엔 고민이었다.
이진 트리였다면 포인터 형식으로 구현해도 괜찮았을 것 같다.
하지만, 그런 제한이 따로 없으므로 단방향 인접 리스트로 구현하도록 했다.
단방향 인접 리스트는 자식을 여러 명 가질 수 있으며, 순회도 간편하다.
Adjacent List
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int leaf_node = 0, deleted_node = 0;
void dfs(int curr, vector<bool>& visit, vector<vector<int>> tree) {
if (visit[curr])
return;
visit[curr] = true;
if (tree[curr].size() == 0)
leaf_node++;
if (tree[curr].size() == 1 && tree[curr][0] == deleted_node)
leaf_node++;
for (int i = 0; i < tree[curr].size(); i++) {
if (tree[curr][i] != deleted_node)
dfs(tree[curr][i], visit, tree);
}
}
int main() {
int nodes = 0, root = 0;
cin >> nodes;
vector<vector<int>> tree(nodes, vector<int>());
vector<bool> visit(nodes, false);
for (int i = 0; i < nodes; i++) {
int parent = 0;
cin >> parent;
if (parent == -1)
root = i;
else
tree[parent].push_back(i);
}
cin >> deleted_node;
if (deleted_node == root)
cout << 0;
else {
dfs(root, visit, tree);
cout << leaf_node;
}
return 0;
}