不同的二叉搜索树 || — Python


一、不同的二叉搜索树 ||

1.程序简介

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。


示例 1

  • 输入:n = 3
  • 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2

  • 输入:n = 1
  • 输出:[[1]]

提示

1 <= n <= 8

2.程序代码

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 27 09:38:58 2021
Function:
@author: 小梁aixj
"""

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
    def to_list(self, count):
        queue = []
        queue.append(self)
        result = []
        while len(queue) > 0:
            if count == 0:
                break
            node = queue.pop(0)
            if node is None:
                result.append('null')
            else:
                count -= 1
                result.append(node.val)
                queue.append(node.left)
                queue.append(node.right)
        return result
class Solution(object):
    def generateTrees(self, n):
        if n == 0:
            return []
        return self.get_trees(1, n)
    def get_trees_impl(self, start, end):
        trees = []
        if start > end:
            trees.append(None)
            return trees
        for i in range(start, end + 1):
            lefts = self.get_trees_impl(start, i - 1)
            rights = self.get_trees_impl(i + 1, end)
            for j in range(len(lefts)):
                for k in range(len(rights)):
                    root = TreeNode(i)
                    root.left = lefts[j]
                    root.right = rights[k]
                    trees.append(root)
        return trees
    def get_trees(self, start, end):
        trees = self.get_trees_impl(start, end)
        results = []
        for tree in trees:
            if tree is None:
                results.append([])
            else:
                results.append(tree.to_list(end))
        return results
#%%
s=Solution()
print(s.generateTrees(n=1))
print(s.generateTrees(n=3))

3.运行结果

在这里插入图片描述


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值