背景
- 假设需要遍历一棵深度为 n 的树形结构,给出各个节点层级,需要按照节点层级给每个节点编号。
- 真实的需求是:有一颗树形结构,深度优先遍历时,得到各节点的深度分别为:1,2,2,3,1,2,2,3,4,4,4,此时给它们编号为
1,1.1,1.2,1.2.1,2,2.1,2.2,2.2.1,2.2.1.1,2.2.1.2,2.2.1.3。
主要思路
public static void main(String[] args) { //层级 int[] levels = {1,2,2,3,1,2,2,3,4,4}; int depth = 4; //计数器 int[] counter = new int[depth]; for(int i = 0; i < levels.length; i++){ int curLevel = levels[i]; //层级加一 counter[curLevel - 1] += 1; //归零 if(i > 0){ for(int j = curLevel; j < counter.length; j++){ counter[j] = 0; } } System.out.println(counter[0] + "." + counter[1] + "." + counter[2]+ "." + counter[3]); } }
主要思路分析
数组 levels 代表要处理的数据,数组 counter 用于计数,counter[0]代表深度为 1 的计数器,counter[1]代表深度为 2 的计数器,依次类推。该思路的平均时间复杂度为 O(depth/2 * n),是线性增长的。
改进思路
public static void main(String[] args) { //层级 int[] levels = {1,2,2,3,1,2,2,3,4,4}; int depth = 4; //计数器 int[] counter = new int[depth]; int lastLevel = 0; for(int i = 0; i < levels.length; i++){ int curLevel = levels[i]; //层级加一 counter[curLevel - 1] += 1; //归零 if(i > 0 && curLevel < lastLevel){ for(int j = curLevel; j < counter.length; j++){ counter[j] = 0; } } lastLevel = curLevel; System.out.println(counter[0] + "." + counter[1] + "." + counter[2]+ "." + counter[3]); } }
改进思路分析
由于引入了 lastLevel 的概念,就可以据此判断是否必须归零。该思路的平均时间复杂度为 O(depth/2/m * n),其中 1<m<depth,它根据实际数据的不同而不同。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于