/**
* 题目描述:
* 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
* 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
* 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
* @author zonebase@163.com
*/
public class day04 {
public static void main(String[] args) {
int preOrder[] ={1,2,4,7,3,5,6,8};
int inOrder[]={4,7,2,1,5,3,8,6};
BinaryTreeNode root=reConstructTree(preOrder,inOrder);
System.out.println("先序输出:");
printPre(root);
System.out.println();
System.out.println("中序输出:");
printIn(root);
System.out.println();
System.out.println("后序输出:");
printBe(root);
}
private static BinaryTreeNode reConstructTree(int preOrder[], int inOrder[]){
//前序的第一个节点就是根节点
BinaryTreeNode root=new BinaryTreeNode(preOrder[0]);
//中序 被根节点分隔,左侧为左节点右侧为右节点
int leftNum=0;
for(int i=0;i<inOrder.length;i++){
if(root.getValue()==inOrder[i]){
leftNum=i;
break;
}
}
int rightNum=preOrder.length-leftNum-1;
if(leftNum>0){
//把左侧节点看成新的二叉树前序和中序
int newPreOrder[] =new int[leftNum];
int newInOrder[] =new int[leftNum];
for(int i=0;i<leftNum;i++){
newPreOrder[i]=preOrder[i+1];
newInOrder[i]=inOrder[i];
}
//进行递归构造
root.setLeft(reConstructTree(newPreOrder,newInOrder));
}
if(rightNum>0){
//把右侧节点看成新的二叉树前序和中序
int newPreOrder[] =new int[rightNum];
int newInOrder[] =new int[rightNum];
for(int i=0;i<rightNum;i++){
newPreOrder[i]=preOrder[inOrder.length-rightNum+i];
newInOrder[i]=inOrder[inOrder.length-rightNum+i];
}
//进行递归构造
root.setRight(reConstructTree(newPreOrder,newInOrder));
}
return root;
}
/**
* 先序输出
* @param tree
*/
private static void printPre(BinaryTreeNode tree){
if(tree!=null){
System.out.print(tree.getValue()+" ");
printPre(tree.getLeft());
printPre(tree.getRight());
}
}
/**
* 中序输出
* @param tree
*/
private static void printIn(BinaryTreeNode tree){
if(tree!=null){
printIn(tree.getLeft());
System.out.print(tree.getValue()+" ");
printIn(tree.getRight());
}
}
/**
* 后序输出
* @param tree
*/
private static void printBe(BinaryTreeNode tree){
if(tree!=null){
printBe(tree.getLeft());
printBe(tree.getRight());
System.out.print(tree.getValue()+" ");
}
}
}
/**
* 二叉树节点类定义
*
* @author zonebase@163.com
* @date 2017年6月8日 下午4:46:12
*/
class BinaryTreeNode {
private int value;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode(int value) {
this.value = value;
}
public BinaryTreeNode(int value, BinaryTreeNode left, BinaryTreeNode right) {
this.value = value;
this.left = left;
this.right = right;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public BinaryTreeNode getLeft() {
return left;
}
public void setLeft(BinaryTreeNode left) {
this.left = left;
}
public BinaryTreeNode getRight() {
return right;
}
public void setRight(BinaryTreeNode right) {
this.right = right;
}
}