题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
(1)由前序遍历结果确定根结点
(2)查找根结点在中序遍历序列中的位置,由此确定左子树和右子树,即中序遍历中根结点左侧的序列为左子树序列,右侧为右子树序列
(3)根据以上方式查找每个子树的根结点,重建左右子树,此步骤通过递归实现
实现
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
this.val=x;
}
}
public class ConstructBinaryTree{
public TreeNode reConstructBinaryTree(int[] preOrder,int[] inOrder){
return constructCore(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);
}
//find root according to preOrder and inOrder
private TreeNode constructCore(int[] preOrder,int startPreOrder,int endPreOrder,int[] inOrder,int startInOrder,int endInorder){
int rootValue=preOrder[startPreOrder]; //find rootValue according to preOrder
TreeNode rootNode=new TreeNode(rootValue); //create rootNode
rootNode.left = null;
rootNode.right = null;
//only one node,return rootNode
if(startPreOrder==endPreOrder){
if(startInOrder==endInorder && preOrder[startPreOrder]==inOrder[startInOrder]){
return rootNode;
}
}
//find the order of rootNode in inOrder
int rootOfInOrder = startInOrder;
while (rootOfInOrder <= endInorder && inOrder[rootOfInOrder] != rootValue){
rootOfInOrder++;
}
//deal with exception
if(rootOfInOrder == endInorder && inOrder[rootOfInOrder] != rootValue){
return null;
}
//calculate the length of leftTree
int leftSubTreeLength = rootOfInOrder - startInOrder;
//calculate the Subscript of leftSubTree's last node
int leftIndexOfPreOrderEnd = startPreOrder + leftSubTreeLength;
//reConstruct leftSubTree
if(leftSubTreeLength>0){
rootNode.left = constructCore(preOrder,startPreOrder+1,leftIndexOfPreOrderEnd,inOrder,startInOrder,rootOfInOrder-1);
}
//reConstruct rightSubTree
if(leftSubTreeLength < endPreOrder - startPreOrder){
rootNode.right = constructCore(preOrder,leftIndexOfPreOrderEnd+1,endPreOrder,inOrder,rootOfInOrder+1,endInorder);
}
return rootNode;
}
//main function for test
public static void main(String[] args) {
int[] pre = {1,2,4,7,3,5,6,8};
int[] in = {4,7,2,1,5,3,8,6};
TreeNode root=new ConstructBinaryTree().reConstructBinaryTree(pre,in);
System.out.println(root);
}
}