95. 不同的二叉搜索树 2
Created: Jul 27, 2020 5:23 PM
Tags: leetcode, 树
思路
求n=2([1,2])时构成二叉搜索树
1作为根节点,[]所有可能作为左子树,[2]所有可能作为右子树
2作为根节点, [1]所有可能作为左子树,[]所有可能作为右子树
也就是把1和2分别当做根节点,左边列表所有可能作为左子树,右边列表所有可能作为右子树
以此类推
求n构成二叉搜索树
依次列表中每个元素作为根节点,左边列表所有可能作为左子树, 右边列表所有可能作为右子树
情况
列表=[]时,返回[None]
列表=[x]时,返回Tree(x)
代码
class Solution:
def __init__(self):
self.rst = []
def helper(self, i, j):
arr = []
if j-i == 1:
t = TreeNode(i)
arr.append(t)
elif j-i>1:
for k in range(i,j):
print(f'列表为{[l for l in range(i,j)]},根为{k}, 左列表{[l for l in range(i,k)]},右边列表{[l for l in range(k+1, j)]}')
for left in self.helper(i, k):
for right in self.helper(k+1, j):
t = TreeNode(k)
t.left = left
t.right = right
arr.append(t)
elif j-i < 1:
arr = [None]
return arr
def generateTrees(self, n: int) -> List[TreeNode]:
if n > 0:
# 注意处理列表和数字的转化关系
return self.helper(1, n+1)
go版本
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// 1:1 这种为0个元素
// 1:2 1个元素
func helper(i int, j int) []*TreeNode{
rst := make([]*TreeNode, 0)
switch {
// 只有一个元素
case i + 1 == j :
tr:=TreeNode{
Val: i,
}
rst = append(rst, &tr)
// 一个元素都没有
case i + 1 > j:
tr:=TreeNode{
}
rst = append(rst, &tr)
// 有至少两个元素
// case i + 1 < j:
default:
for k:=i; k