leetcode # 95. 不同的二叉搜索树 2

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

你可能感兴趣的:(leetcode # 95. 不同的二叉搜索树 2)