TreeNode<K,V> getLcaWithoutParent(TreeNode<K,V> root, TreeNode<K,V> p, TreeNode<K,V> q){
        if (root == null)
            return null ;

        TreeNode left = getLcaWithoutParent(root.left, p, q);
        TreeNode right = getLcaWithoutParent(root.right, p, q);

        // 5 cases !
        if (root == p || root == q) //its the root !
            return root;
        if (left != null && right == null)
            return left;
        else if (left == null && right != null)
            return right;
        else if (left == null && right == null) //neither found
            return null;
        else
            return root; // expected case if in different trees
    }