public class reConstructBinaryTreeTest { static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } /** * 根据中序遍历和前序遍历重建二叉树 * @param pre * @param in * @return */ public TreeNode reConstructBinaryTree(int [] pre,int [] in) { // 结点个数需要相同并且不能少于一个 if (pre.length != in.length || pre.length < 1) { return null; } // 判断结点数是否为1,为1那就是根节点 if (pre.length == 1) { return new TreeNode(pre[0]); } // 根据前序遍历所得的根节点去中序遍历中找其位置 int root = pre[0]; // 存储根节点在中序遍历中的索引 int index = -1; for (int i = 0; i < in.length; i++) { if (root == in[i]) { index = i; break; } } // 如果没找到,代表测试用例有问题 if (index == -1) { throw new RuntimeException("测试用例有问题"); } TreeNode rootNode = new TreeNode(root); // 得到左子树的前序和中序遍历数组 int[] leftChildIn = new int[index]; System.arraycopy(in, 0, leftChildIn, 0, index); int[] leftChildPre = new int[index]; System.arraycopy(pre, 1, leftChildPre, 0, index); // 递归得到左子树结构 rootNode.left = reConstructBinaryTree(leftChildPre, leftChildIn); // 得到右子树的前序和中序遍历数组 int rightChildCount = in.length - index - 1; int[] rightChildIn = new int[rightChildCount]; System.arraycopy(in,index + 1,rightChildIn,0,rightChildCount); int[] rightChildPre = new int[rightChildCount]; System.arraycopy(pre, index + 1, rightChildPre, 0, rightChildCount); // 递归得到右子树结构 rootNode.right = reConstructBinaryTree(rightChildPre, rightChildIn); return rootNode; } @Test public void testreConstruct() { int[] prev = {1,2,4,7,3,5,6,8}; int[] in = {4,7,2,1,5,3,8,6}; TreeNode root = reConstructBinaryTree(prev,in); prevPrintTreeNode(root); System.out.println(); inPrintTreeNode(root); } private void inPrintTreeNode(TreeNode root) { if (root == null) { return; } inPrintTreeNode(root.left); System.out.print(root.val + " "); inPrintTreeNode(root.right); } private void prevPrintTreeNode(TreeNode root) { if (root == null) { return; } System.out.print(root.val + " "); prevPrintTreeNode(root.left); prevPrintTreeNode(root.right); } }