Run error in 1 2 4

import java.util.*;
public class Main {
static class BST {

	private class Node {
		int data;
		Node left;
		Node right;

		public Node(int data) {
			this.data = data;
			this.left = this.right = null;
		}

		public Node() {

		}
	}

	private Node root;

	public BST(int[] arr) {
		construct(arr);
	}

	private void construct(int arr[]) {
		Node nn = new Node();
		nn.data=arr[0];
		root=nn;
		for(int i=1;i<arr.length;i++) {
			add(root,arr[i]);
		}

	}

	public void display() {
		this.display(this.root);
	}

	private void display(Node node) {
		// base case
		if (node == null) {
			return;
		}

		// self work
		String str = "";
		if (node.left == null) {
			str += ".";
		} else {
			str += node.left.data;
		}
		str += " -> " + node.data + " <- ";
		if (node.right == null) {
			str += ".";
		} else {
			str += node.right.data;
		}
		System.out.println(str);
		// left
		display(node.left);
		// right
		display(node.right);
	}

	public boolean find(int item) {
		return this.find(this.root, item);
	}

	private boolean find(Node node, int item) {

		// base case
		if (node == null) {
			return false;
		}
		if (item > node.data) {// search in right tree
			return find(node.right, item);
		} else if (item < node.data) {// search in left tree
			return find(node.left, item);
		} else {// if item = data
			return true;
		}
	}

	public void add(int item) {
		this.add(this.root, item);
	}

	private void add(Node node, int item) {
		if (item > node.data) {// if item is greater add to right
			if (node.right == null) {// if node doesnt has right then add here
				Node nn = new Node();
				nn.data = item;
				node.right = nn;
			} else {// if node has right child then it will handle where to place it
				add(node.right, item);
			}
		} else {// if(item<=node.data
			if (node.left == null) {
				Node nn = new Node();
				nn.data = item;
				node.left = nn;
			} else {
				add(node.left, item);
			}
		}
	}

	public int max() {
		return this.max(this.root);
	}

	private int max(Node node) {
		if (node.right == null) {// if node doesn't have right child therefore it is maximum return its
			return node.data;
		} else {// else go to right
			return max(node.right);
		}
	}

	public void remove(int item) {
		this.remove(this.root, null, false, item);// node,parent node,lchild or rchild,item, for root node parent is
													// null and it doesnt make sense to call it left or right child
													// of
													// null therefore we can pass anyting
	}

	private void remove(Node node, Node parent, boolean ilc, int item) {
		if (node == null) {// node is not present
			return;
		}
		if (item > node.data) {// right call
			remove(node.right, node, false, item);
		} else if (item < node.data) {// left call
			remove(node.left, node, true, item);
		} else {
			if (node.left == null && node.right == null) {// case 1
				if (ilc) {// 1b
					parent.left = null;
				} else {// 1a
					if(node==root) {
						root=null;
						return;
					}
					parent.right = null;
				}
			} else if (node.left == null && node.right != null) {// case 2
				if (ilc) {// 2b
					parent.left = node.right;
				} else {// 2a
					if(node==root) {
						root=node.right;
						return;
					}
					parent.right = node.right;
				}
			} else if (node.left != null && node.right == null) {// case 3
				if (ilc) {// 3b
					parent.left = node.left;
				} else {// 3a
					parent.right = node.left;
					if(node==root) {
						root=node.left;
						return;
					}
				}
			} else {// case 4
				int min = min(node.right);
				node.data = min;// replace with min
				remove(node.right, node, false, min);// delete min
			}
		}

	}

	public void preOrder() {
		this.preOrder(this.root);
	}

	private void preOrder(Node node) {
		if (node == null) {
			return;
		}
		System.out.print(node.data + " ");
		preOrder(node.left);
		preOrder(node.right);
	}

	private int min(Node node) {
		if(node.left==null) {
			return node.data;
		}else {
			return min(node.left);
		}
		
	}
}

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	int t = sc.nextInt();
	while (t-- != 0) {
		int n = sc.nextInt();
		int[] a = new int[n];
		for (int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}
		BST tree = new BST(a);
		int m = sc.nextInt();
		int[] d = new int[m];
		for (int i = 0; i < m; i++) {
			d[i] = sc.nextInt();
			tree.remove(d[i]);
		}

// tree.display();
tree.preOrder();
System.out.println();

	}

}

}

corrected code: