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("--");}}
扩展:如果给出的是中序遍历和后序遍历呢(和上述过程差不多)
前序遍历+后序遍历:不能确定二叉树,所以不能重建
