这个思路是先构建一个树,然后不断地移动根节点的子节点到根节点的位置,但这个过程中需要实现的部分感觉很多,写了一半写不下去了,下面是未完成的草稿
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;
public class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> res = new ArrayList<Integer>();
if(n==0||edges.length==0) return res;
int pos = edges[0][0];
int[] height = new int[n];
List<Integer> pre = new ArrayList<Integer>();
Queue<List<Integer>> later = new LinkedList<List<Integer>>();
while(pre.size()==n){
for(int i=0;i<edges.length;i++){
int left = edges[i][0];
int right = edges[i][1];
if(!pre.contains(left)&&!pre.contains(right)){
List<Integer> pair = new ArrayList<Integer>();
pair.add(left);
pair.add(right);
later.offer(pair);
}else{
if(pre.contains(left)){
height[left]++;
}else{
height[right]++;
}
}
}
while(later.size()!=0&&pre.size()<n){
List<Integer> pair = later.poll();
if(!pre.contains(pair.get(0))&&!pre.contains(pair.get(1))){
later.offer(pair);
}else{
if(pre.contains(pair.get(0))){
height[pair.get(0)]++;
}else{
height[pair.get(1)]++;
}
}
}
}
List<Integer> left = new ArrayList<Integer>();
for(int i=0;i<n;i++){
if(height[i]==0) left.add(i);
}
int[] max = new int[n];
for(int i=0;i<n;i++){
max[i] = Integer.MAX_VALUE;
}
//backtrack to count every height!!!!!
for(int i=0;i<n;i++){
if(!left.contains(i)){
for(int j=0;j<edges.length;j++){
}
}
}
findroots(res,n,edges);
return res;
}
private void findroots(List<Integer> res, int n, int[][] edges) {
// TODO Auto-generated method stub
}
}