動態規劃、DFS 和回溯算法:二叉樹問題的三種視角

動態規劃、DFS 和回溯算法:二叉樹問題的三種視角

在計算機科學中,算法是解決問題的核心。特別是對于復雜的問題,不同的算法可以提供不同的解決方案。在本篇博客中,我們將探討三種算法:動態規劃、深度優先搜索(DFS)和回溯算法,它們如何從不同的角度解決以二叉樹為基礎的問題。

二叉樹問題的核心

二叉樹是一種非常基礎的數據結構,在許多算法問題中都會遇到。一個二叉樹由節點和連接節點的邊組成,每個節點最多有兩個子節點。在解決二叉樹問題時,我們通常需要考慮節點的值、樹的結構、節點間的關系等因素。

動態規劃

動態規劃(Dynamic Programming, DP)是解決優化問題的一種方法。它將一個復雜問題分解成一系列子問題,并存儲子問題的解,以避免重復計算。在二叉樹問題中,動態規劃通常關注整棵子樹。

動態規劃的關注點:子樹

當我們使用動態規劃解決二叉樹問題時,我們通常從葉子節點開始,向上逐步構建解決方案。每個節點都代表了一個子問題的解,而這個解通常依賴于其子節點的解。通過這種方式,我們可以構建出整棵樹的解。

例子:二叉樹的最大路徑和

假設我們要找到一棵二叉樹中的最大路徑和。在這個問題中,路徑可以從任何節點開始,到任何節點結束,但必須沿著樹的邊行進。這是一個典型的可以用動態規劃解決的問題。

我們可以為每個節點定義一個狀態,表示“以該節點為根的子樹中,從該節點出發的最大路徑和”。然后,我們可以用遞歸的方式,從葉子節點向根節點遞推,最終得到整棵樹的最大路徑和。

/*** 二叉樹的直徑* 給你一棵二叉樹的根節點,返回該樹的 直徑 。** 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。** 兩節點之間路徑的 長度 由它們之間邊數表示。* @param root* @return*/public int diameterOfBinaryTree(TreeNode root) {deep(root);return maxDeep - 1;}private int deep(TreeNode root){if(root==null){return 0;}int l = deep(root.left);int r = deep(root.right);maxDeep = Math.max(maxDeep,l+r+1);return 1 + Math.max(l, r);}

回溯算法

回溯算法是一種通過試錯來找到所有/部分解決方案的算法。它的工作原理是逐步構建解決方案,并在發現當前解決方案無法成功時,取消上一步或幾步的計算,再嘗試其他可能的解決方案。

回溯算法的關注點:樹枝

回溯算法在二叉樹問題中關注的是“樹枝”,即從根節點到葉子節點的路徑。在構建解決方案的過程中,回溯算法會遍歷這些路徑,嘗試所有的可能性,并在遇到死胡同時回退。

例子:二叉樹的所有路徑

例如,如果我們要找到一棵二叉樹的所有根到葉子的路徑,回溯算法就非常適合。我們從根節點開始,記錄下路徑,然后遞歸地探索左右子節點。如果到達葉子節點,就記錄下完整的路徑。如果遞歸返回,我們就撤銷當前步驟,嘗試其他選項。

List<List<Integer>> resultAll = new ArrayList<>();public List<List<Integer>> binaryTreePaths(TreeNode root) {List<Integer> result = new ArrayList<>();if (root != null) {result.add(root.val);}binaryTreePathsSub(root, result);return resultAll;}public void binaryTreePathsSub(TreeNode root, List<Integer> result) {if (root == null) {return;}if (root.left == null && root.right == null) {resultAll.add(new ArrayList<>(result));}if (root.left != null) {result.add(root.left.val);binaryTreePathsSub(root.left, result);result.remove(result.size() - 1);}if (root.right != null) {result.add(root.right.val);binaryTreePathsSub(root.right, result);result.remove(result.size() - 1);}}

深度優先搜索(DFS)

深度優先搜索是一種用于遍歷或搜索樹或圖的算法。DFS探索盡可能深的節點,并在必要時通過回溯來探索其他分支。

DFS的關注點:單個節點

DFS在二叉樹問題中關注的是單個節點。它會嘗試沿著一條路徑深入到不能再深入為止,然后回溯到最近的分叉點,嘗試其他路徑。

例子:二叉樹的深度

一個簡單的例子是計算二叉樹的最大深度。DFS可以從根節點開始,盡可能深地遍歷每個分支,直到到達葉子節點。通過記錄遍歷過程中的最大深度,我們可以得到整棵樹的最大深度。

/*** 二叉樹的最大深度* @param root* @return*/int maxDepth(TreeNode root) {traverse(root);return res;}public void traverse(TreeNode root) {if (root == null) {return;}deepth++;traverse(root.left);if (root.left == null && root.right == null) {res = Math.max(res, deepth);}traverse(root.right);deepth--;}

總結

雖然動態規劃、回溯算法和DFS都可以用于解決二叉樹問題,但它們各自關聯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536764.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536764.shtml

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

相關文章

掌握常用Docker命令,輕松管理容器化應用

Docker是一個開源的應用容器引擎&#xff0c;它可以讓開發者將應用程序及其依賴打包到一個輕量級、可移植的容器中&#xff0c;然后發布到任何流行的Linux機器或Windows機器上&#xff0c;也可以實現虛擬化。容器是完全使用沙箱機制&#xff0c;相互之間不會有任何接口。下面介…

Python基礎(九、重要的全局變量)

文章目錄 全局變量是什么&#xff1f;引用全局變量修改全局變量注意事項結語 全局變量是什么&#xff1f; 首先&#xff0c;全局變量是在函數外部定義的變量&#xff0c;它可以在程序的任何地方被訪問。就好像一家人共用的盤子&#xff0c;隨手可以拿來用&#xff0c;但也可能…

智能倉儲管理系統設計與實現

智能倉儲管理系統設計與實現 第一章 緒論 1.1 設計背景 物聯網&#xff08;英文&#xff1a;Internet of Things&#xff0c;縮寫&#xff1a;IoT&#xff09;是萬物相連的互聯網&#xff0c;即把所有物品通過信息傳感設備與互聯網連接起來&#xff0c;以實現智能化識別、定位、…

【Unity入門】NGUI和UGUI比較

目錄 NGUI組件比較多&#xff0c;比較常用的有UGUI組件比較少&#xff0c;比較常用的有NGUI和UGUI比較 現在主流項目中基本上都是NGUI和UGUI&#xff0c;那么到底選哪個&#xff0c;我們先來做個比較 圖集處理功能比較 NGUI需要使用工具手動拼接圖片成圖集。 UGUI開發期間可以直…

Java網絡爬蟲拼接姓氏,名字并寫出到txt文件(實現隨機取名)

目錄 1.爬取百家姓1.爬取代碼2.爬取效果 2.爬取名字1.篩選男生名字2.篩選女生名字 3.數據處理&#xff08;去除重復&#xff09;4.拼接數據5.將數據寫出到文件中 1.爬取百家姓 目標網站&#xff0c;僅作為實驗目的。 ①爬取姓氏網站&#xff1a; https://hanyu.baidu.com/shic…

小狐貍ChatGPT系統 H5前端底部菜單導航文字修改方法

小狐貍ChatGPT系統后端都前端都是編譯過的&#xff0c;需要改動點什么非常難處理&#xff0c;開源版修改后也需要編譯后才能使用&#xff0c;大部分會員也不會使用&#xff0c;像簡單的修改下底部菜單文字、圖標什么的可以對照處理。這里以小狐貍ChatGPT系統1.9.2版本H5端為例&…

JWT signature does not match locally computed signature

1. 問題背景 最近在協助團隊小盆友調試一個驗簽問題&#xff0c;結果還“節外生枝”了&#xff0c;原來不是簽名過程的問題&#xff0c;是token的問題。 當你看到“JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not…

多維時序 | MATLAB實CNN-Mutilhead-Attention卷積神經網絡融合多頭注意力機制多變量時間序列預測

多維時序 | MATLAB實CNN-Mutilhead-Attention卷積神經網絡融合多頭注意力機制多變量時間序列預測 目錄 多維時序 | MATLAB實CNN-Mutilhead-Attention卷積神經網絡融合多頭注意力機制多變量時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 多維時序 | …

異或運算^簡述

異或運算&#xff1a;^ 兩個變量之間異或運算時&#xff0c;其二進制位相同取0&#xff0c;不同取1. 示例&#xff1a;a10 (0b 0000 1010) b3 (0b 0000 0011) a^b9(0b 0000 1001) 據此可以推算異或運算"^"有以下特性&#xff1a; a^a0 (0b 0000 0000)…

python使用apscheduler定時任務,固定周幾運行程序

在add_job中添加參數day_of_week即可&#xff1a; day_of_week "0"表示&#xff1a;只有周一運行day_of_week "0-4"表示&#xff1a;周一到周五運行day_of_week "0,1,2"表示&#xff1a;周一二三運行 示例程序 from datetime import datet…

IDEA基本設置

本博客適用于純新手小白&#xff0c;或者剛下載IDEA想要優化開發添加配置的讀者。 基礎設置 滾輪調整字體大小 打開 IntelliJ IDEA。 轉到菜單欄中的 “File” -> “Settings”&#xff08;Windows/Linux&#xff09;或 “IntelliJ IDEA” -> “Preferences”&#xff…

2024年 Kubernetes 四大趨勢預測

Kubernetes 在生產環境中的復雜性已經成為常態&#xff0c;在2023年這個平臺工程盛行的時代&#xff0c;容器管理的最大亮點可能在于其靈活性&#xff0c;然而在運維政策和治理等方面仍然存在諸多挑戰。Kubernetes 最大的吸引力之一在于其可擴展性和跨環境的廣泛用例。但是&…

CTF show 71

CTF show 71 在源碼中可以看到程序把緩沖區內容全部替換成了問號 ?? ob_get_contents函數把緩沖區內容讀到以后賦值給了變量s&#xff0c;類型是字符串。 ob_end_clean()函數清空當前緩沖區并且關閉緩沖區 ?? 所以展示的結果中全是問號。所以我們需要在讀取到文件以后…

計算機網絡基礎知識分享

計算機網絡基礎知識分享 發送一個http請求&#xff0c;從客戶端到服務器端&#xff0c;都經歷了什么? **Ⅰ&#xff0c;瀏覽器生成消息 ** &#xff08;1&#xff09;瀏覽器輸入網址 我們的探索之旅從在瀏覽器中輸入網址開始&#xff0c;網址&#xff0c;準確來說應該叫 UR…

JVM內存結構Java內存模型Java對象模型

悟空老師思維導圖&#xff1a;https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9 1.JVM內存結構&&Java內存模型&&Java對象模型 1.1.JVM內存結構 1.2.Java對象模型 Java對象模型…

Isaac Sim urdf文件導入

本教程展示如何在 Omniverse Isaac Sim 中導入 urdf 一. 使用內置插件導入urdf 安裝urdf 插件 方法是轉到“window”->“Extensions” 搜索框中輸入urdf, 并啟用 通過轉至Isaac Utils -> Workflows -> URDF Importer菜單來訪問 urdf 擴展。 表格中的 1,2,3 對應著…

問題回復:什么是 Java 中的 Lambda 表達式?有什么應用場景?

Lambda 表達式是 Java 8 引入的一項重要特性&#xff0c;它允許在代碼中以更簡潔的方式表達匿名函數&#xff08;也稱為閉包&#xff09;。Lambda 表達式的引入是為了提供一種更簡單、更便捷的方式來寫匿名內部類。 Lambda 表達式的語法如下&#xff1a; (parameters) -> …

C語言例題3

1.設x、y、z和k都是int型變量&#xff0c;則執行表達式&#xff1a;x&#xff08;y4&#xff0c;z16&#xff0c;k32&#xff09;后&#xff0c;x的值為&#xff08;32&#xff09;&#xff1b; x(y4,z16,k32),x的值為32 理解逗號運算符在c語言中的工作方式&#xff1a;逗號運算…

Visual Basic的故事

Visual Basic&#xff08;VB&#xff09;是一種由Microsoft開發的面向對象的事件驅動編程語言。VB的故事始于上世紀90年代初&#xff0c;它在Windows平臺上的成功對于圖形用戶界面&#xff08;GUI&#xff09;應用程序的開發產生了深遠的影響。以下是關于VB發展過程和相關開發者…

VR全景展示的功能有哪些?適合用于哪些領域?

現如今&#xff0c;VR全景展示技術已經逐漸融入了我們的日常生活中&#xff0c;可能大部分人都還沒有意識到VR全景是如何應用的&#xff0c;但其實VR全景針對多個行業的垂直領域都有一定的落地使用。在互聯網高速發展的今天&#xff0c;多媒體所包含的種類也越來越多&#xff0…