题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:前序遍历序列{ 1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8,6},打印出它的后序遍历
public class BinaryTree {
public static final class BinaryTreeNode{
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
public static BinaryTreeNode construct(int[] priorTree,int[] innerTree){
if (priorTree==null||innerTree==null||innerTree.length<1||priorTree.length<1){
return null;
}
return construct(priorTree,0,priorTree.length-1,innerTree,0,innerTree.length-1);
}
private static BinaryTreeNode construct(int[] priorTree, int ps, int pe, int[] innerTree, int is, int ie) {
if (ps>pe){
return null;
}
int value=priorTree[ps];
int index=is;
//找出中序遍历的根节点的位置,其左边的排列都是其左子树,右边是root的右子树
while(index<=ie){
if (innerTree[index]==value) {
break;
}else {
index++;
}
}
BinaryTreeNode root=new BinaryTreeNode();
root.value=value;
root.left=construct(priorTree,ps,ps+index-is,innerTree,0,index-1);
root.right=construct(priorTree,ps+index-is+1,pe,innerTree,index+1,ie);
return root;
}
//打印后序遍历
public static void paint(BinaryTreeNode root){
while (root!=null){
paint(root.left);
paint(root.right);
System.out.println(root.value);
}
}
}
复制代码