不同的二叉搜索树(II)题解

@toc

🤚我的博客

  • 欢迎光临我的博客:https://blog.csdn.net/qq_52434217?type=blog

🥛前言

动态规划是常见的算法思路,动态规划在计算过程中保存了部分计算结果到内存中,以便于在进行下一次计算时可以直接从内存中获取到而不用再进行计算,可以降低时间复杂度。

动态规划也一直都是一个比较难以形成思路的算法思想。这篇文章虽然是一个简单题,但是记录了动态规划算法的解题思路,方便形成一个固定的解题思路。

📖题目

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

示例:

输入: n = 3

输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

📖二叉搜索树

二叉搜索树满足两个条件:

1、对于根节点而言,左子节点的值<根节点<右子节点的值。

2、对于任意节点而言,都满足条件1。

📖解题

🤔思考过程

既然题目以二叉树为背景,那么考察的算法大概率是回溯。所谓回溯,是指是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止。回溯算法通常采用“深度优先搜索”来遍历解空间。

对于此题而言,我们需要列举每一个根节点的情况,假设输入n=3时,需要考虑根节点分别为1,2,3的情况。即在[1,n]中枚举。并且在枚举的过程中,结合二叉搜索树的性质,对回溯的递归函数做一些边界条件的限制。

前面介绍了,二叉搜索树的性质是ndoe.lef.val < node.val < node.right.val。那么就可以在[1,i-1]中枚举左节点,在[i+1,n]枚举右节点。而这样的问题又可以进一步转化成在[1,i-1]中构造二叉搜索树的子问题。便可以采用递归的方法解决此问题,在每一次递归中都采用回溯法枚举不同的情况。

🤏思路转化代码

分析过程清楚了,但是如何将分析思路转化成代码呢。

首先要清楚递归函数怎么写。在分析过程中我们表述了如何去枚举一个二叉搜索树,那么这个递归函数就是用于枚举不同情况的搜索树。定义递归函数为dfs(start,end),这个函数用于返回不同根节点的二叉树。同时这个函数能够将问题转化成子问题,也就是左子树和右子树。那么就可以进一步转化成dfs(letf,i-1)dfs(i+1,right)。然后我们需要将树的结构用数组保存下来,在左子树和右子树中选择一棵树拼接到根节点即可。

转化成代码如下

def dfs(start,end):ans = []for i in range(start,end):# 枚举左子树left = dfs(start,i-1)# 枚举右子树right = dfs(i+1,right)for x in left:for y in right:root = TreeNode(i)root.left,root.right = x,yans.append(root)return ans

我们完成了函数的核心功能,但是需要考虑到一个边界情况:当start>end时,应该怎么处理?

这里只需要处理成返回[None]即可。因为这种情况不可能存在。

所以这个函数的完整代码如下

def dfs(start,end):if start > end:return [None]ans = []for i in range(start,end):# 枚举左子树left = dfs(start,i-1)# 枚举右子树right = dfs(i+1,right)for x in left:for y in right:root = TreeNode(i)root.left,root.right = x,yans.append(root)return ans

到这里我们就可以写出整个题目的代码了,为了便于debug,这里把打印函数也写出来了。

# from typing import List,Optionalclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightself.res = []def preorder(root,res):if root:res.append(root.val)preorder(root.left,res)preorder(root.right,res)else:res.append(None)return resclass Solution:def generateTrees(self, n: int) -> List[Optional[TreeNode]]:def dfs(l,r):if l > r:return [None]ans = []for i in range(l,r+1):for x in dfs(l,i-1):for y in dfs(i+1,r):root = TreeNode(i)root.left,root.right=x,yans.append(root)return ansreturn dfs(1,n)if __name__ =='__main__':s = Solution()r = s.generateTrees(3)for i in r:print(preorder(i,[]))

💠END

数据结构与算法题还在继续更新,虽然是学习的大佬的思路。但是自己能进行输出也是一种学习的方法和技巧。

一起加油!🆙🆙🆙

🏕️公众号

欢迎关注小夜的公众号,一个立志什么都能会的研究生。有不懂的地方请留言踢我!
微信公众号


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Text2SQL】Spider 数据集

论文&#xff1a;Spider: A Large-Scale Human-Labeled Dataset for Complex and Cross-Domain Semantic Parsing and Text-to-SQL Task ⭐⭐⭐⭐⭐ EMNLP 2018, arXiv:1809.08887 Dataset: spider GitHub: github.com/taoyds/spider 一、论文速读 本文提出了 Text2SQL 方向的…

1.4 Mac 电脑 Clion 安装教程

目录 1 安装 2 激活 3 汉化 1 安装 去 https://www.jetbrains.com/clion/download/other.html 下载: 也可以直接到链接进行下载:https

嵌入式全栈开发学习笔记---C语言笔试复习大全23

目录 联合体 联合体的定义 联合体的长度 如果来判断设备的字节序&#xff1f; 如何把大端数据转换成小端数据&#xff1f; 枚举 枚举的定义 上一篇复习了结构体&#xff0c;这一节复习联合体和枚举。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff…

docker镜像容器搭建nominatim地理编码服务

1、下载地图pbf文件: https://planet.openstreetmap.org/ 2、nominatim官网 https://nominatim.org/release-docs/latest/admin/Installation/ 3、地图文件打包&#xff1a; docker run -it --shm-size20g \ -e PBF_PATH/nominatim/data/china-latest.osm.pbf \ -e REPLIC…

C语言PTA练习题:三角形类别,输入三角形三条边,求面积,四则计算器,猴子吃桃

7-1 三角形类别 输入三个整数&#xff0c;以这三个数为边长&#xff0c;判断是否构成三角形&#xff1b;若不能输出"no"&#xff0c;若构成三角形&#xff0c;进一步判断它们构的是&#xff1a;锐角三角形或直角三角形或钝角三角形.分别输出"ruijiao",&qu…

GitLens或者Git Graph在vscode中对比文件历史变化,并将历史变化同步到当前文件中

有时候我们上周改的代码&#xff0c;现在想反悔把它恢复过来&#xff0c;怎么办&#xff1f;&#xff1f;&#xff1f;很好&#xff0c;你有这个需求&#xff0c;说明你找对人了&#xff0c;那就是我们需要在vscode中安装这个插件&#xff1a;GitLens或者Git Graph&#xff0c;…

门禁-jenkins的构建状态同步到gitlab提交流水线

API接口文档 https://docs.gitlab.cn/jh/api/commits.html 配置pipline流水线 生成http请求代码&#xff1a; 使用HttpRequest插件生成 - sharelibs内容 //这是share libs里的 package devopsdef httpReq(reqType, reqUrl, reqBody, accessToken){def gitServer "…

有一个3x4的矩阵,要求用函数编写程序求出其中值最大的那个元素,以及其所在的行号和列号

常量和变量可以用作函数实参&#xff0c;同样数组元素也可以作函数实参&#xff0c;其用法与变量相同。数组名也可以作实参和形参&#xff0c;传递的是数组的起始地址。 用数组元素作函数实参&#xff1a; 由于实参可以是表达式&#xff0c;而数组元素可以是表达式的组…

2000 年至 2015 年中国(即水稻、小麦和玉米1km 网格)三种主要作物年收获面积的时空变化

摘要 可靠、连续的主要作物收获面积信息对于研究地表动态和制定影响农业生产、土地利用和可持续发展的政策至关重要。然而&#xff0c;中国目前还没有高分辨率的空间明确和时间连续的作物收获面积信息。全国范围内主要农作物收获面积的时空格局也鲜有研究。在本研究中&#xf…

2024年【熔化焊接与热切割】考试内容及熔化焊接与热切割考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试内容考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割复审模拟考试很简单。 1、【单选题】…

SpringBoot【1】集成 Druid

SpringBoot 集成 Druid 前言创建项目修改 pom.xml 文件添加配置文件开发 java 代码启动类 - DruidApplication配置文件-propertiesDruidConfigPropertyDruidMonitorProperty 配置文件-configDruidConfig 控制层DruidController 运行验证Druid 的监控应用程序 前言 JDK版本&…

前端开发-添加公用的ts文件,并在Vue文件中引用

一般我们把页面要用的公用函数写在一个ts文件中 通过调用这个ts文件让我们可以在vue文件中使用函数 Eg&#xff1a;我们现在创建一个formRules.ts文件 然后在我们需要调用该函数体的vue文件中 import { required } from "/utils/formRules";有可能语法一开始会提示…

防火墙——域网络、专用网络、公用网络

在防火墙设置中&#xff0c;域网络、专用网络和公用网络是指计算机连接到网络时所处的不同环境。每种环境都有不同的安全级别和配置。 1、域网络&#xff08;宽松&#xff09; 域网络是指计算机加入了一个Windows域&#xff08;Domain&#xff09;环境&#xff0c;这通常在企业…

程序员的那些经典段子

哈喽&#xff0c;大家好&#xff0c;我是明智&#xff5e; 本周咱们已经解决了在面试中经常碰到的OOM问题&#xff1a; 《美团一面&#xff0c;发生OOM了&#xff0c;程序还能继续运行吗&#xff1f;》 《美团一面&#xff1a;碰到过OOM吗&#xff1f;你是怎么处理的&#xff1…

白嫖的在线工具类宝藏网站清单,快点击进来收藏一波

简单整理了一下自己日常经常使用的10个免费工具网站&#xff0c;建议点赞关注收藏&#xff0c;快点分享给小伙伴们&#xff01; 1.奶牛快传:用户体验更好的网盘工具。 https://cowtransfer.com/ 今年开始使用的一款网盘工具&#xff0c;和百度网盘类似,叫奶牛快传&#xff0c;如…

【设计模式】——装饰模式(包装器模式)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

数据结构--二叉搜索树

目录 二叉搜索树的概念 二叉树的实现 结点类 函数接口总览 实现二叉树 二叉搜索树的应用 K模型 KV模型 二叉搜索树的性能分析 二叉搜索树的概念 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种特殊的二叉树&#xff0c;其具有以下几…

6818 android 修改开机 logo, 编译脚本分析

问题&#xff1a; 客户需要去掉 android5.1 的开机logo. 说明&#xff1a; 对于Android5.1 来说&#xff0c;uboot 与kernel 的logo 是一个。 过程&#xff1a; 其实对于开机logo 的修改很简单&#xff0c;直接参考厂家手册就可以了。 这是 android4.4 的开机logo 的修改&…

产品经理-需求收集(二)

1. 什么是需求 指在一定的时期中&#xff0c;一定场景中&#xff0c;无论是心理上还是生理上的&#xff0c;用户有着某种“需要”&#xff0c;这种“需要”用户自己不一定知道的&#xff0c;有了这种“需要”后用户就有做某件事情的动机并促使达到其某种目的&#xff0c;这也就…