时间限制:1 秒
内存限制:32 兆
- 题目描述:
-
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
-
package jzoffer; public class reConstructBinaryTree { /** * 一棵二叉树 * <pre> * A(1) * B(2) C(3) * D(4) E(5) F(6) * </pre> * A:1 B:2 C:3 D:4 E:5 F:6 * 前序遍历:1 2 4 5 3 6 * 中序遍历:4 2 5 1 3 6 * 后续遍历:4 5 2 6 3 1 * @param root * @author LSM */ public static void main(String[] args) { int [] preOrder = {1,2,4,5,3,6}; int [] inOrder = {4,2,5,1,3,6}; BinaryTreeNode node = reConstruct(preOrder, inOrder); System.out.println("后续遍历结果为(4 5 2 6 3 1):"); printTree(node); } public static BinaryTreeNode reConstruct(int [] preOrder, int [] inOrder){ if(preOrder == null || inOrder == null || preOrder.length!=inOrder.length || preOrder.length<1){ return null; //特殊情况的判断 } return construct(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1); //方法调用进行递归 } public static BinaryTreeNode construct(int [] preOrder,int ps,int pe,int [] inOrder,int is ,int ie){ if(ps>pe){ //目前还不知道这句话什么意思 return null; } int value = preOrder[ps]; //将前序遍历也就是第一个根节点保存下来 int index = is; //index的创建是为了进行后序遍历中找到根节点的位置 while(index<=ie && inOrder[index] != value){ index ++; } //通过这个while循环,我们就可以找到在中序遍历序列中的根节点的位置 //如果在中序遍历的过程中 我们没有找到 那就是输入的不合法了 if(index >ie){ System.out.println("输入不合法------"); return null; } BinaryTreeNode node = new BinaryTreeNode();//新构造一棵树 node.value = value; //否则将找到的vlue(根节点)给新构造的一棵树 也就是这个新树的根节点 //接下来我们就要进入递归了,先是要进入左子树的递归,我们需要左子树的前序遍历,后序遍历的结果集合 进行递归 //当前节点(也就是根节点)的左子树的个数为 index-is 要知道他的个数 然后进而算出他的位置 //左子树对应的前序遍历的位置在preOrder[ps+1,ps+index-is] 这个也就是左子树前序遍历的 元素数组 //左子树对应的中序遍历的位置在preOrder[0,index-is] 这个也就是左子树中序遍历的元素数组 node.left = construct(preOrder, ps+1, ps+index-is, inOrder,0,index-is); //左子树递归 //当前节点(也就是根节点)的右子树的个数为 ie-index 要知道他的个数 然后进而算出他的位置 //右子树对应的前序遍历位置在preOrder[ps+index-is+1,pe] 这个也就是右子树前序遍历的 元素数组 //右子树对应的中序遍历位置在inOrder[index+1,ie] node.right=construct(preOrder,ps+index-is+1,pe,inOrder,index+1,ie); //右子树递归 return node; //返回我们自己构造的这棵树 } public static void printTree(BinaryTreeNode binaryTreeNode){ if(binaryTreeNode != null){ printTree(binaryTreeNode.left); printTree(binaryTreeNode.right); System.out.print(binaryTreeNode.value+" "); } } } class BinaryTreeNode{ int value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int value){ this.value = value; } public BinaryTreeNode() { } }