最佳实践
输出二叉树的右视图
http://www.nowcoder.com/questionTerminal/c9480213597e45f4807880c763ddd5f0
1、在重建二叉树过程中,对不同层的最右边节点收集 res大小与level比较,dfs根左右,那么i位置存的就是i层最左
import java.util.*;
public class Solution {
private List<Integer> res;
private Map<Integer, Integer> map;
public int[] solve (int[] pre, int[] in) {
res = new ArrayList<>();
map = new HashMap<>();
for(int i=0;i<in.length;i++){
map.put(in[i], i);
}
dfs(pre,0, pre.length - 1, in, 0, in.length - 1, 0);
int[] ans = new int[res.size()]; // 转成数组返回
for (int i = 0; i < res.size(); i++) {
ans[i] = res.get(i);
}
return ans;
}
private void dfs(int[] myPre, int start1, int end1, int[] myIn, int start2, int end2, int level) {
if (start1 > end1) {
return;
}
int rootVal = myPre[start1]; // 当前根结点
//刚开始size =0 level0 加入根节点 下一层。。。lev=1 size=1 然后加入左节点了 到了右节点时候2<=1不成立
if (res.size() <= level) {//最左
res.add(rootVal);
}else {//如果有右
res.set(level, rootVal);
}
int i = map.get(rootVal);
dfs(myPre,start1 + 1, start1 + i - start2, myIn,start2, i - 1, level + 1);
dfs(myPre,start1 + i - start2 + 1, end1,myIn, i + 1, end2, level + 1);
}
}
