剑指offer面试题7:重建二叉树的Java实现
思路基本根据书中的代码,部分代码因Java和c++的不同有少量变化。自己这个Java新手所写,可能存在一些问题,欢迎大家一起探讨!
二叉树节点类代码如下:
public class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
重建二叉树的方法:
static BinaryTreeNode construct(int[] preorder, int[] inorder) {
int length = preorder.length;
if (preorder == null || inorder == null || length <= 0)
return null;
return constructCore(preorder,inorder, 0, length - 1, 0, length - 1);
}
核心方法:
/**
*
* @param preorder 前序遍历数组
* @param inorder 中序遍历数组
* @param startPreorder 每次递归构建树时 数据在前序数组的起始索引
* @param endPreorder 构建树时 数据在前序数组的结束索引
* @param startInorder 构建树时 数据在中序数组的起始索引
* @param endInorder 构建树时 数据在中序数组的结束索引
* @return
*/
private static BinaryTreeNode constructCore(int[] preorder,int[] inorder,int startPreorder, int endPreorder, int startInorder, int endInorder) {
int rootValue=preorder[startPreorder];
BinaryTreeNode root=new BinaryTreeNode();
root.value=rootValue;
root.left=root.right=null;
if(startPreorder==endPreorder){
if(startInorder==endInorder){
return root;
}else{
System.err.println("invalid input1");
return null;
}
}
//在中序遍历中找到根结点的位置
int rootInorder=startInorder;
while(rootInorder<=endInorder&&inorder[rootInorder]!=rootValue)
rootInorder++;
//如果遍历完中序没有找到对应rootValue的值,说明输入错误
if(rootInorder==endInorder&&inorder[rootInorder]!=rootValue){
System.err.println("invalid input2");
return null;
}
//计算左右子树在前序数组中的范围
int leftLength=rootInorder-startInorder;
int leftPreorderEnd=startPreorder+leftLength;
//构造左子树
if(leftLength>0){
root.left=constructCore(preorder, inorder,startPreorder+1, leftPreorderEnd, startInorder, rootInorder-1);
}
//构造右子树
if(leftLength<endPreorder-startPreorder){
root.right=constructCore(preorder, inorder,leftPreorderEnd+1, endPreorder, rootInorder+1, endInorder);
}
return root;
}
//前序遍历输出看结果
public static void preTraverse(BinaryTreeNode root){
if(root==null) return ;
System.out.print(root.value+",");
preTraverse(root.left);
preTraverse(root.right);
}
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=construct(preOrder, inOrder);
preTraverse(root);
}
1,2,4,7,3,5,6,8,