不同的二叉搜索樹(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.pswp.cn/web/15860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15860.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu部署Dolphinscheduler單機版并配置PG數據庫

1、下載并解壓Dolphinscheduler DolphinScheduler | 下載 (apache.org) 下載完成后得tar.gz包 下載穩定版 下載穩定版 下載穩定版 tar -zxvf apache-dolphinscheduler-3.1.9-alpha-bin.tar.gz mv apache-dolphinscheduler-3.1.9-alpha-bin dolphinscheduler-bin cd dolph…

【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;而數組元素可以是表達式的組…

Oracle 12C開機自啟動

Oracle 12C設置開機自啟動 1、本文內容 背景說明檢查Oracle當前環境修改配置文件/etc/oratab添加數據庫啟動腳本dbstart 2、背景說明 最近因上線新的兩套系統&#xff0c;增加4套測試環境&#xff0c;由于昨晚機房電路故障&#xff0c;部分物理服務器需要關鍵&#xff0c;電…

2000 年至 2015 年中國(即水稻、小麥和玉米1km 網格)三種主要作物年收獲面積的時空變化

摘要 可靠、連續的主要作物收獲面積信息對于研究地表動態和制定影響農業生產、土地利用和可持續發展的政策至關重要。然而&#xff0c;中國目前還沒有高分辨率的空間明確和時間連續的作物收獲面積信息。全國范圍內主要農作物收獲面積的時空格局也鮮有研究。在本研究中&#xf…

2024年【熔化焊接與熱切割】考試內容及熔化焊接與熱切割考試報名

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 熔化焊接與熱切割考試內容考前必練&#xff01;安全生產模擬考試一點通每個月更新熔化焊接與熱切割考試報名題目及答案&#xff01;多做幾遍&#xff0c;其實通過熔化焊接與熱切割復審模擬考試很簡單。 1、【單選題】…

Django的模型層——2模型實例

1. 類的屬性 objects&#xff1a;是Manager類型的對象&#xff0c;用于與數據庫進行交互 當定義模型類時沒有指定管理器&#xff0c;則Django會為模型類提供一個名為objects的管理器 支持明確指定模型類的管理器 class BookInfo(models.Model):...books models.Manager()當為…

C# 運算符重載的技術深入分析

C# 運算符重載的技術深入分析 一、引言 在C#中&#xff0c;運算符重載是一個允許開發者自定義類或結構中特定運算符行為的特性。通過這個特性&#xff0c;可以為自定義類型創建與內置類型一致的語義&#xff0c;使得代碼更直觀、更易理解。 二、運算符重載基礎 2.1 定義和概…

網絡安全從入門到精通(特別篇I):應急響應之網站入侵排查思路

藍隊應急響應實戰 1. 應急響應-網站入侵-基礎知識2. 應急響應-網站入侵-技能掌握3. 應急響應-網站入侵-案例分析3.1 網站入侵-排查思路-首要任務3.2 IIS&.NET-注入-基于時間配合日志分析3.3 Apache&PHP-漏洞-基于漏洞配合日志分析3.4 Tomcat&JSP-弱口令-基于后門配…

SpringBoot【1】集成 Druid

SpringBoot 集成 Druid 前言創建項目修改 pom.xml 文件添加配置文件開發 java 代碼啟動類 - DruidApplication配置文件-propertiesDruidConfigPropertyDruidMonitorProperty 配置文件-configDruidConfig 控制層DruidController 運行驗證Druid 的監控應用程序 前言 JDK版本&…

33.perf工具使用

文章目錄 基本介紹perf命令使用reference 歡迎訪問個人網絡日志&#x1f339;&#x1f339;知行空間&#x1f339;&#x1f339; 基本介紹 Perf&#xff08;Performance Counters for Linux&#xff0c;性能計數器子系統&#xff09;是一個Linux性能分析工具&#xff0c;用于分…

分析 Base64 編碼和 URL 安全 Base64 編碼

前言 在處理數據傳輸和存儲時&#xff0c;Base64 編碼是一種非常常見的技術。它可以將二進制數據轉換為文本格式&#xff0c;便于在文本環境中傳輸和處理。Go 語言提供了對標準 Base64 編碼和 URL 安全 Base64 編碼的支持。本文將通過一個示例代碼&#xff0c;來分析這兩種編碼…

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

一般我們把頁面要用的公用函數寫在一個ts文件中 通過調用這個ts文件讓我們可以在vue文件中使用函數 Eg&#xff1a;我們現在創建一個formRules.ts文件 然后在我們需要調用該函數體的vue文件中 import { required } from "/utils/formRules";有可能語法一開始會提示…