| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | 
							- func findMinHeightTreesBFS(n int, edges [][]int) (res []int) { // BFS, start from leaf
 
- 	if n <= 2 {
 
- 		for i := 0; i < n; i++ {
 
- 			res = append(res, i)
 
- 		}
 
- 		return
 
- 	}
 
- 	adj := make([][]int, n)
 
- 	inDegree := make(map[int]int)
 
- 	for i := range edges {
 
- 		a, b := edges[i][0], edges[i][1]
 
- 		adj[a] = append(adj[a], b)
 
- 		adj[b] = append(adj[b], a)
 
- 		inDegree[a]++
 
- 		inDegree[b]++
 
- 	}
 
- 	for 2 < len(inDegree) {
 
- 		li := make([]int, 0)
 
- 		for k, v := range inDegree {
 
- 			if v == 1 {
 
- 				li = append(li, k)
 
- 			}
 
- 		}
 
- 		for _, i := range li {
 
- 			for _, j := range adj[i] {
 
- 				if v, ok := inDegree[j]; ok {
 
- 					inDegree[j] = v - 1
 
- 				}
 
- 			}
 
- 			delete(inDegree, i)
 
- 		}
 
- 	}
 
- 	for k, _ := range inDegree {
 
- 		res = append(res, k)
 
- 	}
 
- 	return
 
- }
 
- type pair struct {
 
- 	_1 int
 
- 	_2 int
 
- }
 
- func findMinHeightTrees(n int, edges [][]int) (res []int) {
 
- 	adj := make([][]int, n)
 
- 	for i := range edges {
 
- 		a, b := edges[i][0], edges[i][1]
 
- 		adj[a] = append(adj[a], b)
 
- 		adj[b] = append(adj[b], a)
 
- 	}
 
- 	minDepth := 1<<32 - 1
 
- 	color := make([]int, n)
 
- 	m := make(map[pair]int)
 
- 	for i := 0; i < n; i++ {
 
- 		maxDepth := getDepth(adj, color, i, &m)
 
- 		if maxDepth < minDepth {
 
- 			minDepth = maxDepth
 
- 			res = []int{i}
 
- 		} else if maxDepth == minDepth {
 
- 			res = append(res, i)
 
- 		}
 
- 	}
 
- 	return
 
- }
 
- func getDepth(adj [][]int, color []int, id int, m *map[pair]int) (depth int) {
 
- 	if len(adj[id]) == 1 && color[adj[id][0]] == 1 {
 
- 		return
 
- 	}
 
- 	color[id] = 1
 
- 	for _, i := range adj[id] {
 
- 		if color[i] != 0 {
 
- 			continue
 
- 		}
 
- 		if d, ok := (*m)[pair{id, i}]; ok {
 
- 			depth = maxInt(depth, d)
 
- 			continue
 
- 		}
 
- 		d := getDepth(adj, color, i, m)
 
- 		(*m)[pair{id, i}] = d
 
- 		depth = maxInt(depth, d)
 
- 	}
 
- 	color[id] = 0
 
- 	return depth + 1
 
- }
 
- func maxInt(x, y int) int {
 
- 	if x < y {
 
- 		return y
 
- 	}
 
- 	return x
 
- }
 
 
  |