题目:重建二叉树
输入二叉树的前序遍历和中序遍历重构二叉树,树表示方式为链表
前序遍历:1 2 4 5 3 6 7 ,根-左-右 ,根节点:7,左子树:2 4 5,右子树:3 6 7
中序遍历:4 2 5 1 6 3 7 ,左-根-右 ,根节点:7,左子树:4 2 5,右子树:6 3 7
public class Offer10 {
public static void main(String[] args) {
int[] preorder = {1,2,4,5,3,6,7};
int[] inorder = {4,2,5,1,6,3,7};
PreorderTraversal(rebuildTree(preorder,inorder));
}
public static TreeNode rebuildTree(int[] preorder,int[] inorder){
//先先序遍历构建根节点,再根据中序遍历确定左右子树的数量
if (preorder==null||preorder.length==0)return null;
TreeNode root = new TreeNode(preorder[0]);
int index = searchRootIndex(preorder,inorder);
//构建左子树
//复制数组函数→前闭后开
root.left = rebuildTree(Arrays.copyOfRange(preorder,1,index+1),
Arrays.copyOfRange(inorder,0,index));
//构建右子树
root.right = rebuildTree(Arrays.copyOfRange(preorder,index+1,preorder.length),
Arrays.copyOfRange(inorder,index+1,inorder.length));
return root;
}
public static int searchRootIndex(int[] preorder,int[] inorder){
for (int i = 0; i < inorder.length; i++) {
if(inorder[i]==preorder[0])return i;
}
return -1;
}
//前序遍历
public static void PreorderTraversal(TreeNode node){
System.out.print(node.value+" ");
if(node.left!=null)PreorderTraversal(node.left);
if(node.right!=null)PreorderTraversal(node.right);
}
}
class TreeNode {
TreeNode left;
TreeNode right;
Integer value;
public TreeNode(Integer value) {
this.value = value;
}
public TreeNode(TreeNode left, TreeNode right, Integer value) {
this.left = left;
this.right = right;
this.value = value;
}
}