/**
*
* 树的结构
*
*/
class BinaryTree{
int data;
BinaryTree left;
BinaryTree right;
}
/**
*
* 重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字
*
*/
public class RebuildBiTree {
/**
*
* @param preorder 前序遍历结果
* @param inorder 中序遍历结果
* @param rootIndex 根节点在前序遍历结果中的位置
* @param start 子数序列在中序遍历结果中的起始位置
* @param end 子数序列在中序遍历结果中的终止位置
* @param root 根节点
* @return 返回数的根节点
*/
public BinaryTree rebuildTree(int[] preorder,int[] inorder,int rootIndex,int start,int end,BinaryTree root){
if(preorder == null || inorder == null || preorder.length!=inorder.length || preorder.length == 0 || inorder.length == 0){
return root;
}
root = new BinaryTree();
root.data = preorder[rootIndex];
//根节点在中序遍历结果中的位置
int rootIndexInInorder = -1;
for(int i = start;i <= end;i++){
if(root.data == inorder[i]){
rootIndexInInorder = i;
break;
}
}
//如果有左子树
if(rootIndexInInorder - start >= 1 ){
//rootIndex为在前序遍历结果中的位置
root.left = rebuildTree(preorder,inorder,rootIndex+1,start,rootIndexInInorder-1,root.left);
}
//如果有右子树
if(end - rootIndexInInorder >= 1 ){
root.right = rebuildTree(preorder,inorder,rootIndex + rootIndexInInorder-start + 1,rootIndexInInorder+1,end,root.right);
}
return root;
}
//中序遍历
public void inorder(BinaryTree root){
if(root != null){
inorder(root.left);
System.out.println(root.data);
inorder(root.right);
}
}
public static void main(String[] args) {
RebuildBiTree rbt = new RebuildBiTree();
BinaryTree root = null;
int[] preorder = {1,2,4,7,3,5,6,8};
int[] inorder = {4,7,2,1,5,3,8,6};
root = rbt.rebuildTree(preorder, inorder, 0, 0, preorder.length - 1, root);
rbt.inorder(root);
}
}