void mixLists(
      LinkedList<Integer> left,
      LinkedList<Integer> right,
      ArrayList<LinkedList<Integer>> mix,
      LinkedList<Integer> before) {
    if (before.isEmpty() || right.isEmpty()) {
      LinkedList<Integer> l = new LinkedList<>();
      l = (LinkedList<Integer>) before.clone();
      l.addAll(left);
      l.addAll(right);
      mix.add(l);
      return;
    }
    int hl = left.removeFirst();
    before.addLast(hl);
    mixLists(left, right, mix, before);
    before.removeLast();
    left.addFirst(hl);

    int hr = right.removeFirst();
    before.addLast(hr);
    mixLists(left, right, mix, before);
    before.removeLast();
    right.addFirst(hr);
  }
  ArrayList<LinkedList<Integer>> bstSequences(TN nd) {
    ArrayList<LinkedList<Integer>> seq = new ArrayList<>();
    if (nd == null) {
      seq.add(new LinkedList<Integer>());
      return seq;
    }

    LinkedList<Integer> before = new LinkedList<>();
    before.add(nd.val);

    ArrayList<LinkedList<Integer>> left_seq = bstSequences(nd.left);
    ArrayList<LinkedList<Integer>> right_seq = bstSequences(nd.right);

    for (LinkedList<Integer> left : left_seq) {
      for (LinkedList<Integer> right : right_seq) {
        ArrayList<LinkedList<Integer>> mix = new ArrayList<>();
        mixLists(left, right, mix, before);
        seq.addAll(mix);
      }
    }
    return seq;
  }