重建二叉树 --剑指offer

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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;
    }
}

 

posted @ 2020-03-04 15:59  nlw  阅读(108)  评论(0编辑  收藏  举报