输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路 :前序的第一个结点是根结点,然后在中序找到该结点的下标。可以分出左右子树的前中序。然后递归调用就可以
public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre == null || in == null || pre.length != in.length){ return null; } //建立根结点 TreeNode treeNode=new TreeNode(pre[0]); int index=0; //找到根结点位置在中序的位置,找到左右子树的分开位置记为index for(int i =0;i< in.length;i ++){ if(in[i] == treeNode.val){ index=i; break; } } int[] lpre=new int[index];//左子树的前序 int[] lin=new int[index];//左子树的中序 int[] rpre=new int[in.length-index-1];//右子树的前序 int[] rin=new int[in.length-index-1];//右子树的中序 if(index >0)//判断是否有左子树 只要index的位置不是第一个(下标为0)就是有左子树 { for(int i = 0;i <lpre.length;i ++){ lpre[i]=pre[i+1]; lin[i]=in[i]; } treeNode.left=reConstructBinaryTree(lpre,lin); }else{ treeNode.left=null; } if(index < in.length-1)//判断是否有右子树 只要index的位置不是最后一个就是有右子树 index<in.length-1 { for(int i = 0;i < rpre.length;i ++){ rpre[i]=pre[index+i+1]; rin[i]=in[index+i+1]; } treeNode.right=reConstructBinaryTree(rpre,rin); } else{ treeNode.right=null; } return treeNode; } }