def bst_sequences_backtrack(nums: List[int]) -> List[List[int]]: tree = Tree.create_bst(tree_vals) root = tree.root ret = [] level = 0 # use level to trace the depth for recusion for debugging def backtrack(choices, weave, level=0): if not choices: ret.append(weave) for i in range(len(choices)): # pick node to put in weave node = choices[i] # new next choices = remaning next choices + the picked node's children next_choices = choices[:i] + choices[i + 1:] if node.left: next_choices.append(node.left) if node.right: next_choices.append(node.right) backtrack(next_choices, weave + [node.val], level + 1) backtrack([root], []) return ret
def bst_sequences(nums: List[int]) -> List[List[int]]: tree = Tree.create_bst(tree_vals) root = tree.root def fn(node) -> List[List[int]]: if not node: return [[]] ret = [] left = fn(node.left) right = fn(node.right) for seq_left in left: for seq_right in right: weave(seq_left, seq_right, [node.val], ret) return ret return fn(root)