题目要求求出距某一节点为1,2,3,4.。。M-1距离的节点数目。
这个题目首先给出了一个用数组存tree的方法。传统方法是用链表方式。这里给出了数组方式。当然如果是二叉树,用数组很好表示,但是这里的树的度并没有限制,最终却存在一个On空间的方法,值得学习。不过这里有一个要求就是节点的值是从0开始连续的值。
任何一个树都可以选择任意一个节点作为root,然后为了表示某一个节点是root,我们可以对该节点做特殊处理,就是让其指向自己,即A[i]=i。对于其余的点,每一层都指向其父节点,A[i]=j,i是子节点,j是父节点。这样正好可以用On的数组来表示整颗树。而且表示方式是唯一的对于每一棵树而言。
解题思路是,按照bfs输出即可。当时为了满徐题目Om的复杂度,需要对tree做处理,因为要找i的孩子节点,在数组的表示下只能遍历,这样复杂度是n2,所以开始先用一个map来存每一个节点的子节点,这样查找就是O1级别的。整体的复杂度是On。
public int[] position(int[] array){
if(array == null) return null;
Map<Integer, List<Integer>> map = new HashMap<>();
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < array.length; i++){
int des = array[i];
if(des == i){
queue.add(i);
continue;
}
if(!map.containsKey(des))
map.put(des, new ArrayList<>());
map.get(des).add(i);
}
int[] res = new int[array.length - 1];
int layer = -1;
while(!queue.isEmpty()){
int size = queue.size();
if(layer != -1)
res[layer] = size;
for(int i = 0; i < size; i++){
int des = queue.poll();
List<Integer> list = map.get(des);
if(list != null)
queue.addAll(list);
}
layer++;
}
return res;
}