package cracking_the_coding_interview.ch_04;
import java.util.ArrayList;
import java.util.List;
public class BSTSequences {
private static List<List<Integer>> bstSequences(TreeNode root) {
List<List<Integer>> bstSequences = new ArrayList<>();
if (root == null) {
bstSequences.add(new ArrayList<>());
return bstSequences;
}
var leftBstSequences = bstSequences(root.left);
var rightBstSequences = bstSequences(root.right);
for (var leftBstSequence: leftBstSequences)
for (var rightBstSequence: rightBstSequences) {
List<Integer> prefix = new ArrayList<>(List.of(root.val));
backtrack(bstSequences, leftBstSequence, 0, rightBstSequence, 0, prefix);
}
return bstSequences;
}
private static void backtrack(List<List<Integer>> result, List<Integer> left, int leftPtr, List<Integer> right, int rightPtr, List<Integer> prefix) {
if (leftPtr == left.size() && rightPtr == right.size()) {
result.add(new ArrayList<>(prefix));
return;
}
if (leftPtr < left.size()) {
int leftVal = left.get(leftPtr);
prefix.addLast(leftVal);
backtrack(result, left, leftPtr + 1, right, rightPtr, prefix);
prefix.removeLast();
}
if (rightPtr < right.size()) {
int rightVal = right.get(rightPtr);
prefix.addLast(rightVal);
backtrack(result, left, leftPtr, right, rightPtr + 1, prefix);
prefix.removeLast();
}
}
}