

문제 해석

나의 풀이
var findMinHeightTrees = function(n, edges) {
//root 노드를 찾는 간단한 문제
obj={};
edges.forEach((El)=>{
let [start,end]=El
if(!obj[start]) obj[start]=[end];
else {
obj[start].push(end);
}
if(!obj[end]) obj[end]=[start];
else{
obj[end].push(start);
}
})
// 이거를 토대로 bfs 깊이 우선 돌리면서 가면 됨
const dfs= function(start_node,visited_arr){
let final_length=Infinity;
let queue=[[start_node,0]];
while(queue.length>0){
let [first_go,count]= queue.shift();
// 하나빼기
if(visited_arr[first_go]==0){
// 이런경우에만 갈수 있음
visited_arr[first_go]=1;
for(var i=0; i<obj[first_go].length; i++){
let what_is_go= obj[first_go][i]
if(visited_arr[what_is_go]==0){
visited_arr[what_is_go]=1;
// 하나갈수 있다고 가정하고
queue.unshift([what_is_go,count+1])
final_length= Math.min(final_length,count+1)
}
}
}
}
return final_length;
}
let real_answer=Infinity;
for(var i=0;i<n; i++){
//시작하는 노드
let visited=Array.from({length:n}).fill(0);
real_answer= Math.min(dfs(i, visited),real_answer)
}
return real_answer;
};
/**
* @param {number} n
* @param {number[][]} edges
* @return {number[]}
*/
var findMinHeightTrees = function(n, edges) {
//root 노드를 찾는게 아니라 양방향으로 연결된 tree 중 깊이가 최소 인것을 찾는문제
if(n==1) return [0]
let new_tree= Array.from({length:n},()=>new Set());
edges.forEach((el)=>{
let [a,b]=el;
new_tree[a].add(b);
new_tree[b].add(a);
})
let go_queue=[]
// 가운데 있는 루트를 찾기 위해서 자식노드가 없는 leaf 을 찾아야된다
new_tree.forEach((EO,index)=>{
if(new_tree[index].size==1){
go_queue.push(index)
}
})
// leaf 노드( 시작점을 알아냄)
let total_node_length= n;
while(total_node_length>2){
//여기서 leaf 노드를 삭제해야됨 따라서 leaf 노드를 삭제한 부모의 자식도 없어지면. 다시 넣어서 while 문을 돌린다는 의미
// go_queue 에다가 bfs 을 한다는 의미라고 생각해도됨
total_node_length-=go_queue.length;
let hey_check=[]
for(const hey of go_queue){
let check= [...new_tree[hey]][0];
//set의 인덱스에 접근할수 없다
new_tree[check].delete(hey);
// 자식노드를 지운다.
if(new_tree[check].size==1){
hey_check.push(check)
}
}
go_queue=hey_check;
}
return go_queue
};