问题
如果只给定一个二叉树前序遍历数组pre和一个中序遍历数组in能否不重建树,而直接生成这个二叉树后序数组并返回已知二叉树中没有重复值。
思想
中序遍历确定根节点位置,看根节点之前有几个数表示左孩子有几个几点,然后在先序遍历中在根节点后找对应的数量节点,递归左树和右树。用一张map维护一个中序遍历的结果。键存的是节点值,值存索引方便找到根节点位置。
代码
public class Code01_PreAndInArrayToPosArray {
public static int[] preInToPos(int[] pre, int[] in) {
if(pre == null ||in == null) {
return new int[0];
}
if(pre.length != in.length) {
return new int[0];
}
int N = in.length;
HashMap<Integer, Integer> inMap = new HashMap<>();
for(int i = 0; i < N; i++) {
inMap.put(in[i], i);
}
int[] pos = new int[N];
process(pre, 0, N-1, in, 0, N-1, pos, 0, N-1, inMap);
return pos;
}
public static void process(int[] pre,int L1, int R1,int[] in, int L2, int R2,int[] pos,int L3, int R3,HashMap<Integer, Integer>inMap) {
if(L1 > R1) {
return;
}
if(L1 == R1) {
pos[L3] = pre[L1];
return;
}
int mid = inMap.get(pre[L1]);
int leftSize = mid - L2;
process(pre,L1+1,L1+leftSize,in,L2,mid-1,pos,L3,L3+leftSize-1,inMap);
process(pre, L1+leftSize+1, R1, in, mid+1, R2, pos, L3+leftSize, R3-1, inMap);
}
}