这道题目要求找到所有可能的数组序列,这些序列能够通过从左到右的插入操作重建给定的二叉搜索树(BST)。解题关键是理解每个节点必须在它的所有子孙节点之前出现。解决这个问题的方法是使用回溯法来模拟这个过程。算法使用一个队列来存储当前可用于插入到序列中的节点,这些节点是已经在序列中的节点的直接子节点。回溯过程中,从队列中选择一个节点,将其添加到当前路径,然后将其子节点添加到队列中,继续递归。每次递归调用后,需要将路径和队列状态回溯到之前的状态,以便尝试其他的选择。
时间复杂度: O(n!)
空间复杂度: O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def BSTSequences(self, root: TreeNode) -> List[List[int]]:
if root is None:
return [[],]
self.result = []
path = []
queue = [root,]
self.trace(path, queue)
return self.result
def trace(self, path, queue):
if len(queue)==0: # 检查是否所有节点都已经被处理
self.result.append(path[:])
return
i=0
end = len(queue) # 保存当前队列的长度
while i<end:
root = queue.pop(i)
path.append(root.val)
# 添加当前节点的子节点到队列
if root.left:
queue.append(root.left)
if root.right:
queue.append(root.right)
self.trace(path, queue)
# 回溯,恢复队列和路径的状态
queue.insert(i, root)
del queue[end:]
del path[-1]
i +=1