【刷題】初步認識深搜(DFS)

在這里插入圖片描述

送給大家一句話:
擁有希望的人,和漫天的星星一樣,是永遠不會孤獨的。
-- 《星游記》

初步認識深搜(DFS)

  • dfs算法
  • 二叉樹中的深搜
    • Leetcode 129. 求根節點到葉節點數字之和
      • 題目描述
      • 算法思路
    • Leetcode 814. 二叉樹剪枝
      • 題目描述
      • 算法思路
    • Leetcode 98. 驗證二叉搜索樹
      • 題目描述
      • 算法思路
    • Leetcode 257. 二叉樹的所有路徑
      • 題目描述
      • 算法思路
  • Thanks?(・ω・)ノ謝謝閱讀!!!
  • 下一篇文章見!!!

dfs算法

深度優先搜索(DFS)是一種常用的搜索算法,它通過盡可能深地搜索樹的分支,來尋找解決方案。由于其簡單和易于實現的特性,DFS成為解決問題的強大工具,尤其是在數據規模較小的情況下。數據在100以內一般使用DFS

運行原理: DFS算法的核心思想是從一個起點開始,沿著樹的邊走到盡可能深的分支上,然后回溯到之前的分叉點,尋找未探索的分支,對不滿足條件的分支進行剪枝。這個過程重復進行,直到找到解決方案或探索完所有可能的路徑。DFS通常使用遞歸實現,這使得代碼簡潔易讀。

dfs算法其實我們一點也不陌生,早在二叉樹的學習中,用于遍歷二叉樹的前序遍歷,中序遍歷,后序遍歷都是使用的dfs算法,所以dfs并不神秘!!!我們接下來在實際應用中來加強對dfs算法的認識。

二叉樹中的深搜

我準備了以下題目,我們一起來看看吧:

Leetcode 129. 求根節點到葉節點數字之和

家人們!上鏈接:129. 求根節點到葉節點數字之和

題目描述

在這里插入圖片描述
根據題目,每條路徑都是一個數字,我們要做的是將每條路徑的數字加起來得到一個和。

算法思路

我們的工作就是得到每條路徑的數字,而得到這些數字的最簡單的辦法就是使用dfs算法,一條一條的搜索下去。

使用dfs算法我們需要明白dfs函數體是對一個節點的處理,我們要顧全好大局,避免出現不必要的錯誤。
通常我們使用全局變量來優化我們的dfs函數體,通過全局變量,就不需要傳遞過多的參數了。

class Solution {
public://int sumNumbers(TreeNode* root) {vector<long long > nums;dfs(nums ,0 , root);long long  ans = 0 ;for(auto s : nums)ans += s;return ans;}void dfs(vector<long long >& nums , long long bef , TreeNode* root){if(root == nullptr) return ;if(root->left == nullptr && root->right == nullptr){bef *= 10;nums.push_back(bef + root->val);}dfs(nums , bef * 10 + root->val , root->left);dfs(nums , bef * 10 + root->val , root->right);}
};

提交:過啦!!!

Leetcode 814. 二叉樹剪枝

上鏈接:814. 二叉樹剪枝

題目描述

在這里插入圖片描述
本題需要我們對二叉樹進行判斷,將不滿足條件的進行剪枝操作。

算法思路

我們主要需要進行兩步:判斷與剪枝

  1. 判斷需要對子樹進行判斷是否有1;
  2. 剪枝就直接將指向設置為nullptr即可;

dfs的函數體只針對當前節點進行判斷,我們要相信其中的dfs可以解決后續問題。

  1. 首先需要對當前節點進行判斷,如果為空直接返回空指針!
  2. 然后我們需要對左右子樹進行判斷,判斷的結果時(子樹滿足條件就是原本的子樹,反之是nullptr)
  3. 對左右子樹檢查好了,就要檢查當前節點,如果左右子樹都為空了,并且當前節點的數字還是 0 ,直接進行刪除!

其實這套算法的本質是后序遍歷,從葉子節點開始向上刪除。

class Solution {
public:TreeNode* pruneTree(TreeNode* root) {return dfs(root);}TreeNode* dfs(TreeNode* root){//后序遍歷//返回值決定上層是否刪除if(root == nullptr) return nullptr;//是葉子節點才返回else {//該層處理root->left = dfs(root->left);root->right = dfs(root->right);if(!root->right && !root->left && root->val == 0 ) return nullptr;else return root;}}
};

提交:過啦!!!

Leetcode 98. 驗證二叉搜索樹

上連接:98. 驗證二叉搜索樹

題目描述

在這里插入圖片描述
這題對于我們學過二叉搜索樹,AVL樹,紅黑樹的簡直是小菜一碟!

算法思路

二叉搜索樹有一個重要的性質:中序遍歷會得到有序數據。
所以判斷是否為二叉搜索樹就可以通過這個性質來判斷,我們模擬進行中序遍歷:

  1. 中序遍歷的核心是先左子樹 ,再當前節點 ,最后是右子樹
  2. 那么為了快速進行判斷是否有序,我們肯定不能把所有的數據都遍歷一遍再判斷是否有序!而是在遍歷的過程中就完成判斷的過程!
  3. 判斷是否有序就是比較當前數是否比它之前那個數大!那么如何獲取之前的數呢?很簡單,因為我們是以模擬中序遍歷,很自然的就可以獲取到當前節點之前的那個數!
  4. 記住 : dfs函數體只需要考慮如何解決當前節點!!!不要多考慮!
class Solution {
public://使用全局變量來記錄 上一個節點的值long long prev = LONG_MIN ; bool isValidBST(TreeNode* root) {return dfs(root);}//dfs函數bool dfs(TreeNode* root){//如果為空就直接返回if(root == nullptr) return true;//通過中序遍歷解決問題//對左進行判斷bool l = dfs(root->left);if(!l) return false;//對當前節點進行判斷if(root->val <= prev) return false;//再當前節點更新 prevprev = root->val;//對右邊進行判斷bool r = dfs(root->right);if(!r) return false;return l && r;}
};

提交:過啦!!!
再分析一個中序遍歷的題目,框架是一致的:230. 二叉搜索樹中第K小的元素

Leetcode 257. 二叉樹的所有路徑

上鏈接:257. 二叉樹的所有路徑

題目描述

在這里插入圖片描述
非常好理解的題目奧

算法思路

這道題的思路很簡單,把所有的路徑都遍歷一遍就可以了!
注意細節的處理:

  1. 路徑何時加上->才能保證不會多加? 再當前節點不為空,將val一起插入,還有左右子樹再插入->即可
  2. 何時路徑結束? 到葉子節點就結束!
  3. 注意回溯的問題!!!
class Solution {
public:vector<string> ans;vector<string> binaryTreePaths(TreeNode* root) {string path = "";dfs(path , root);return ans;}void dfs(string path , TreeNode* root){if(root == nullptr) return ;path += to_string(root->val);if(!root->left && !root->right) {ans.push_back(path);return ;}path += "->";//對左邊進行處理 if(root->left) dfs(path , root->left);//對右邊進行處理if(root->right) dfs(path , root->right);}
};

提交過啦!!!

Thanks?(・ω・)ノ謝謝閱讀!!!

下一篇文章見!!!

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

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

相關文章

Redis-實戰篇-緩存更新策略(內存淘汰、超時剔除、主動更新)

文章目錄 1、緩存更新策略1.1、內存淘汰1.2、超時剔除1.3、主動更新 2、業務場景&#xff1a;3、主動更新在企業中業務實現有三種方式3.1、Cache Aside Pattern3.1.1、操作緩存和數據庫時有三個問題需要考慮&#xff1a;3.1.1.1、刪除緩存還是更新緩存&#xff1f;3.1.1.2、如何…

數據同步軟件有哪些

數據同步軟件有哪些呢&#xff1f;隨著企業規模的擴大&#xff0c;企業數據也積累得越來越多&#xff0c;萬一發生宕機風險&#xff0c;那么這個損失將不可估量。所以為了容災備用&#xff0c;我們往往需要將數據同步到另一臺備胎服務器上&#xff0c;進行冗余。 那么需要同步的…

centos7.9 python3環境(virtualenv)搭建及所遇錯誤

人望山&#xff0c;魚窺荷&#xff0c;真正喜歡想要的&#xff0c;沒有一樣可以輕易得到。 目錄 # 1. 解決版本沖突問題--建議不要跳過(一定要查看軟鏈接是否鏈接正確) # 2. python3(virtualenv)環境搭建 # 3. virtualenv常用命令 # 4. 所遇錯誤解析 ## 4.1 遇到 No modul…

惠海 H6246低功耗DC/DC降壓型恒壓芯片60V降3.3V5V12V 藍牙模塊 單片機供電

1.產品描述 H6246是一種內置60V耐壓MOS&#xff0c;支持輸入高達48V的高壓降壓開關控制器&#xff0c;可以向負載提供0.3A的連續電流。H6246支持輸出恒定電壓&#xff0c;可以通過調節VFB采樣電阻來設置輸出電壓&#xff0c;同時支持最大電流限制&#xff0c;可以通過修改CS采…

操作系統期末復習考題二

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文??????三、總結&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

【資源調度】1-何為調度?

導讀&#xff1a;本期是全網最全【資源調度】系列推文的第1期(共50期左右)。我們將對調度的定義與作用、計劃與調度的關系、調度問題的拆解做出詳細介紹&#xff0c;使大家對【資源調度】問題有了一個整體的認識&#xff0c;為后續的內容奠定基礎。 作者1&#xff1a;張哲銘&am…

個人搭建cppreference網站

近日,由于購買的騰訊云服務器要過期了,之前在服務器搭建的cppreference也要重新搭建,故寫下此文章 cppreference的訪問速度也慢,故自己WSL子系統簡單搭鍵一下是個不錯的選擇 環境準備 首先,自己先安裝Nginx,在網上找安裝教程即可下載cppreference網站資源包:https://pan.baidu…

ubuntu 軟鏈接(ubuntu20.04)

ubuntu 軟鏈接&#xff08;ubuntu20.04&#xff09; 在Ubuntu和其他Linux系統中&#xff0c;軟鏈接&#xff08;也稱為符號鏈接&#xff09;是文件系統中的一個特殊類型的文件&#xff0c;它作為一個引用或指針&#xff0c;指向另一個文件或目錄。軟鏈接類似于Windows中的快捷…

java-快速排序 4

總結 快速排序是一種高 java (String[] args) { int[] array {10, 7, 8, 9, 1, 5, 7, 8}; // 基本快速排序 int[] basicArray array.clone(); basicQuickSort(basicArray, 0, basicArray.length - 1); System.out.println("Basic…

unity ScrollRect裁剪ParticleSystem粒子

搜了下大概有這幾種方法 通過模板緩存通過shader裁剪區域&#xff1a;案例一&#xff0c;案例二&#xff0c;案例三&#xff0c;三個案例都是類似的方法&#xff0c;需要在c#傳入數據到shader通過插件 某乎上的模板緩存方法link&#xff0c;&#xff08;沒有登錄看不到全文&a…

混沌工程介紹

概念 混沌工程是通過實驗探究系統穩定性的實踐過程&#xff0c;其作戰武器是風險因子&#xff0c;即在系統中引入風險變量來驗證系統對風險的抵抗能力&#xff0c;它的作用是推動系統容錯能力建設、驗證監控告警及時性、提升研發問題排查能力。 混沌工程的工作內容 推動基礎…

RFID固定資產管理系統在企業中的應用與優勢

隨著企業資產規模的不斷擴大和管理復雜性的增加&#xff0c;傳統的資產管理方式已無法滿足企業高效管理的需求。RFID固定資產管理系統憑借其高效、準確、實時的特點&#xff0c;成為企業固定資產管理的新寵。 一、什么是RFID固定資產管理系統 RFID&#xff08;無線射頻識別&…

磁盤分區工具(fdisk 和 parted)區別及操作筆記

fdisk 和 parted 都是 Linux 系統中用于磁盤分區的工具。 兩者主要區別&#xff1a; 支持的分區表類型&#xff1a; fdisk 主要支持 MBR分區表&#xff0c;MBR分區表支持的硬盤單個分區最大容量為2TB&#xff0c;最多可以有4個主分區。parted 支持 MBR分區表 和 GPT分區表&…

使用AI工具 Baidu Comate 輔助編碼 快速定位修改Bug

一、Baidu Comate 概述 Baidu Comate&#xff08;百度智能編碼助手&#xff09;是一款基于文心大模型的新一代編碼輔助工具。它結合了百度多年積累的編程現場大數據和外部優秀開源數據&#xff0c;旨在為用戶提供高質量的編程代碼生成和優化服務。Comate的主要目標是提升編碼效…

人力資源敏捷管理

SБ_Итоговая аттестация_Управление человеческими ресурсами и их развитием в совр. организаци 你好&#xff0c;Вэйдун。當你提交此表單后&#xff0c;擁有者將會看到你的姓名和電子…

幫助某服務業公司制定發展戰略與未來規劃

在集團公司高速發展、業務范圍不斷擴大時&#xff0c;組織往往對公司未來的發展方向感到迷茫&#xff0c;不知道如何進行更好的規劃&#xff0c;找到合適的發展戰略&#xff0c;為企業提供更長遠的發展空間&#xff0c;帶來更多是利益。面對這個問題&#xff0c;華恒智信認為企…

【Hive SQL】時間戳格式化、時間字符串轉換格式化、時區切換(Mysql\Hive SQL\Athena)

文章目錄 一、日期格式化1、時間戳格式化2、日期字符串格式化3、時區切換4、時區列表 一、日期格式化 本文主要記錄 [Mysql\ Hive SQL\ Athena] 時間戳轉換、日期格式化、時區轉換各種數據數據操作 1、時間戳格式化 1、毫秒值轉 yyyy-MM-dd HH:mm:ss Mysql select FROM_UN…

AXI接口簡介

AXI接口&#xff0c;全稱為Advanced eXtensible Interface&#xff0c;是ARM公司推出的一種高性能、低成本、可擴展的高速總線接口。AXI接口是ARM公司提出的AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;高級微控制器總線架構的一部分。2003年發布了…

股票回購(Share Repurchase)是什么?中英雙語介紹

股票回購 中文版 股票回購是指一家金融公司使用其現金儲備從公開市場上回購自身股票的行為。這一操作通常有以下幾個原因&#xff1a; 提升股價&#xff1a;當公司認為其股票被市場低估時&#xff0c;通過減少市場上的流通股數量&#xff0c;可以提升每股的市場價值。優化資…

RK3568平臺(USB篇)UVC驅動分析

一.UVC簡介 攝像頭分為兩類&#xff1a; 1.CAMER接口的攝像頭&#xff1b; 2.USB接口接口的攝像頭&#xff1b; 這里主要介紹usb攝像頭的設備驅動程序。 UVC全稱為USB Video Class&#xff0c;即&#xff1a;USB視頻類&#xff0c;是一種為USB視頻捕獲設備定義的協議標準。…