아주 기본적인 트리 구현 문제였다.
자료구조의 기본적인 감을 되찾기 위해 기본으로 돌아갔다.
가장 먼저, 어떤 방식으로 트리를 구현할 지가 처음엔 고민이었다.
이진 트리였다면 포인터 형식으로 구현해도 괜찮았을 것 같다.
하지만, 그런 제한이 따로 없으므로 단방향 인접 리스트로 구현하도록 했다.
단방향 인접 리스트는 자식을 여러 명 가질 수 있으며, 순회도 간편하다.
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 ;
}