import java.util.ArrayList;
import java.util.Arrays;
/**
* 面试题7:重建二叉树
* 输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字
* 例如,输入前序遍历{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6}
* 重建并输出头节点
*/
public class No7 {
//递归(传入数组拷贝)
public static BinaryTree reConstructBinaryTree(int[] pre, int[] in) {
//首先考虑测试用例
//(1)普通二叉树(完全二叉树,不完全二叉树)
//(2)特殊二叉树(所有节点都没有左(右)节点的二叉树,只有一个节点的二叉树)
//(3)特殊输入用例(前序遍历和中序遍历不匹配,根节点为null)
if (pre == null || in == null || in.length == 0 || in.length != pre.length) {
return null;
}
BinaryTree root = new BinaryTree(pre[0]);
for (int i = 0; i < pre.length; i++) {
if (pre[0] == in[i]) {
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
}
}
return root;
}
public static void main(String[] args) {
int[] pre = {1,2,4,7,3,5,6,8};
int[] in = {4,7,2,1,5,3,8,6};
BinaryTree.printPostTree(reConstructBinaryTree(pre,in));
}
}
class BinaryTree {
public BinaryTree left;
public BinaryTree right;
public int value;
public BinaryTree(int value) {
this(null, null, value);
}
public BinaryTree(BinaryTree left, BinaryTree right, int value) {
this.left = left;
this.right = right;
this.value = value;
}
public void insertLeft(BinaryTree currentNode, int value) {
if (currentNode == null) {
return;
}
BinaryTree newLeftNode = new BinaryTree(value);
if (currentNode.left != null) {
newLeftNode.left = currentNode.left;
}
currentNode.left = newLeftNode;
}
public void insertRight(BinaryTree currentNode, int value) {
if (currentNode == null) {
return;
}
BinaryTree newRightNode = new BinaryTree(value);
if (currentNode.right != null) {
newRightNode.right = currentNode.right;
}
currentNode.right = newRightNode;
}
//前序遍历二叉树
public static void printPreTree(BinaryTree currentNode) {
if (currentNode == null) {
return;
}
System.out.print(currentNode.value);
System.out.print("--");
if (currentNode.left != null) {
printPreTree(currentNode.left);
}
if (currentNode.right != null) {
printPreTree(currentNode.right);
}
}
//中序遍历二叉树
public static void printInTree(BinaryTree currentNode) {
if (currentNode == null) {
return;
}
if (currentNode.left != null) {
printInTree(currentNode.left);
}
System.out.print(currentNode.value);
System.out.print("--");
if (currentNode.right != null) {
printInTree(currentNode.right);
}
}
//后序遍历二叉树
public static void printPostTree(BinaryTree currentNode){
if(currentNode == null){
return;
}
if(currentNode.left != null){
printPostTree(currentNode.left);
}
if (currentNode.right != null){
printPostTree(currentNode.right);
}
System.out.print(currentNode.value);
System.out.print("--");
}
}
扩展:如果给出的是中序遍历和后序遍历呢(和上述过程差不多)
前序遍历+后序遍历:不能确定二叉树,所以不能重建