从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。
给定一个由不同节点组成的二叉搜索树 root
,输出所有可能生成此树的数组。
示例 1:
输入: root = [2,1,3] 输出: [[2,1,3],[2,3,1]] 解释: 数组 [2,1,3]、[2,3,1] 均可以通过从左向右遍历元素插入树中形成以下二叉搜索树 2 / \ 1 3
示例 2:
输入: root = [4,1,null,null,3,2] 输出: [[4,1,3,2]]
题目意思为每一个节点都必须排在它的子孙结点前面
开始想到dfs,就是找到叶节点路径的呗。
class Solution:
def BSTSequences(self, root: TreeNode) -> List[List[int]]:
return self.dfs(root, []) if root else [[]]
def dfs(self, node, ls):
ans = []
n = node.val
if node.left:
ls = ls + [node.left]
if node.right:
ls = ls + [node.right]
for idx,cho in enumerate(ls):
new = ls[:idx] + ls[idx+1:]
for ll in self.dfs(cho, new):
ans.append([n] + ll)
return ans if ans else [[n]]
经历两个for太长了,优化一下。
class Solution:
def BSTSequences(self, root: TreeNode) -> List[List[int]]:
def dfs(node, path, qu):
newpath = path + [node.val]
if node.left: qu.append(node.left)
if node.right: qu.append(node.right)
if not qu: ans.append(newpath)
for idx, nex in enumerate(qu):
dfs(nex, newpath, qu[:idx]+qu[idx+1:])
ans = []
if not root: return [[]]
dfs(root, [], [])
return ans
对于这种找路径的题目,都是这个模板