给定一棵二叉树的前序,和中序的遍历数组(不含重复数字),重构这棵二叉树,
/**
* 方法
* @param pre
* @param mid
* @return
*/
public Node method1(int[] pre, int[] mid) {
if (pre == null || mid == null) {
return null;
}
return core(pre, 0, pre.length - 1, mid, 0, mid.length - 1);
}
/**
* 核心代码
* @param pre
* @param ps
* @param pe
* @param mid
* @param ms
* @param me
* @return
*/
public Node core(int[] pre, int ps, int pe, int[] mid, int ms, int me) {
if (ps > pe || ms > me) {
return null;
}
//前序遍历的数组的第一位是根节点
Node root = new Node(pre[ps]);
//找到根节点,根节点前后分成两部分,分别是左右子树
for (int i = ms; i <= me; i++) {
if (mid[i] == pre[ps]) {
//i - ms 是子树的节点个数
root.left = core(pre, ps + 1, ps + i - ms, mid, ms, i - 1);
root.right = core(pre, i - ms + 1 + ps, pe, mid, i + 1, me);
}
}
return root;
}