力扣—95不同的二叉搜索树II(递归)

题目描述

给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。

 

示例:

输入:3
输出:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

   1          3      3      2          1
     \        /       /       / \            \
     3     2      1      1   3           2
    /      /          \                         \
   2     1           2                        3

解题思路:

递归

对于一颗二叉搜索树,左子树节点均小于根节点,右子树节点均大于根节点,因此对于一个节点i,递归构建左子树0~i-1,和右子树i+1~n

class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def generateTrees(self, n):
        def generate_trees(start, end):
            if start > end:
                return [None]
            all_trees = []
            for i in range(start, end + 1):
                left_trees = generate_trees(start, i - 1)
                right_trees = generate_trees(i + 1, end)
                for l in left_trees:
                    for r in right_trees:
                        cur_tree = TreeNode(i)
                        cur_tree.left = l
                        cur_tree.right = r
                        all_trees.append(cur_tree)
            return all_trees
        return generate_trees(1, n) if n != 0 else []

S = Solution()
print(S.generateTrees(3))

运行过程解释:

对于n = 3,首先是节点1(即i = 1),左子树调用generate_trees(1,0)返回None,右子树调用generate_trees(2, 3),经过一系列执行后返回的列表是[2, 3],列表中不是单一的值,而是子树的所有组合的根节点,这里列表中的2实际上还有一个3的右节点,3实际上有一个2的左节点,遍历所有的可能组合,1的左子树永远为空,右子树的根节点既可以为2也可以为3,同理i = 2和i = 3也一样的过程

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值