PreOrder and Inorder to tree construction

My code is giving segmentation fault, why?

#include<bits/stdc++.h>

using namespace std;

template

class TreeNode{

public:

    T data;

    TreeNode* left;

    TreeNode* right;

    TreeNode(T data){

        this->data=data;

        left=NULL;

        right=NULL;

    }

};

void printTree(TreeNode* root){

if(root==NULL){

    return;

}

cout<<root->data;

if(root->left){

    printTree(root->left);

}

if(root->right){

    printTree(root->right);

}

}

TreeNode* InPre(int *ino,int *pre,int inS,int inE,int preS,int preE){

int rootData=pre[preS];

TreeNode<int>* root=new TreeNode<int>(rootData);

int i=inS;

while(ino[i]!=rootData){

    i++;

}

int linS=inS;

int linE=i-1;

int lpreS=preS+1;

int lpreE=preS+linE-linS+1;

int rinS=i+1;

int rinE=inE;

int rpreS=lpreE+1;

int rpreE=preE;

root->left=InPre(ino,pre,linS,linE,lpreS,lpreE);

root->right=InPre(ino,pre,rinS,rinE,rpreS,rpreE);

return root;

}

int main(){

int n;

cin>>n;

int *pre=new int[n];

int *ino=new int[n];

for(int i=0;i<n;i++){

    cin>>ino[i];

}

for(int i=0;i<n;i++){

    cin>>pre[i];

}

TreeNode<int>* root=InPre(ino,pre,0,n-1,0,n-1);

printTree(root);

}