重建二叉树
核心思路:
- 因为二叉树的前序的第一个树必为父结点,而中序中则以该节点为界,左边的则为其左节点,右边的则为其右节点。
- 通过递归重复完成上诉过程就行
代码:
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
//先判断pre或in数组是否为空,或者其长度为0,如果是,说明条件不符合或就是空树,直接返回空
if (pre == null || in == null || pre.length <= 0 || in.length <= 0) {
return null;
}
//如果只有一个节点,也不用往下走,直接返回
if (in.length == 1) {
return new TreeNode(in[0]);
}
int c = pre[0];
//寻找父节点
int mid = 0;
for (; mid < pre.length; mid++) {
if (c == in[mid]) {
break;
}
}
//如果遍历了数组还是没有父节点就返回空
if (mid == pre.length) {
return null;
}
//构建树
TreeNode root = new TreeNode(c); //根节点
//结点左边的子树
int[] midLeft = Arrays.copyOf(in, mid); //左子树中序
int[] preLeft = new int[midLeft.length]; //左子树前序
System.arraycopy(pre, 1, preLeft, 0, preLeft.length);
int[] midRight = new int[pre.length - mid-1]; //右子树中序
int[] preRight = new int[midRight.length]; //右子树前序
System.arraycopy(in, mid+1, midRight, 0, midRight.length);
System.arraycopy(pre, mid+1, preRight, 0, preRight.length);
//递归遍历,获取树的左节点和右结点
root.left = reConstructBinaryTree(preLeft, midLeft);
root.right = reConstructBinaryTree(preRight, midRight);
//返回根节点
return root;
}
查看11道真题和解析