257. 二叉樹的所有路徑(js)

257. 二叉樹的所有路徑——DFS + 回溯(js)

  • 題目描述
  • 解題思路
  • 完整代碼
  • 時間復雜度分析

題目描述

257. 二叉樹的所有路徑

解題思路

  1. 題意理解

    給定一棵二叉樹,要求返回所有從根節點到葉子節點的路徑,路徑以字符串形式表示,格式如 “1->2->5”。

  2. 算法選擇:DFS + 回溯

    由于需要找出所有從根到葉子的路徑,自然想到使用深度優先遍歷(DFS)

    同時,因為路徑是一個從根開始的逐步構建過程,我們需要在遞歸過程中記錄當前路徑,并在遞歸返回時撤銷(回溯)上一步的選擇。

  3. 遞歸終止條件

    如果遇到了 null ,向上返回

    如果遇到了 葉子節點 ,說明得到了一條新的路徑,加入結果集,然后返回。

  4. 路徑的記錄與處理

    我們使用一個數組 path 來記錄當前從根節點到當前節點的路徑。

    當遇到葉子節點(即 left == null && right == null)時,把 path 用 “->” 連接成字符串加入最終結果數組。

    注意:每次遞歸后需要 回溯(pop彈出) 上一個節點,確保路徑的正確性。

  5. 邊界情況處理

    如果根節點為 null,直接返回空數組。

    如果樹中只有一個節點,也能正常處理為一個路徑。

更直觀的理解:
想象你正站在一棵樹的某個節點上,此時路徑數組(path)中保存的是從根節點到當前節點所經過的路徑。
接下來,你需要繼續從當前節點出發,分別向的左子樹和右子樹遞歸前進。
當你遇到空節點或葉子節點(即遞歸的終止條件)時,說明當前這條路徑已經走到盡頭,此時會開始從下往上返回,并在返回的過程中撤銷剛剛加入的路徑節點(這一步是“回溯”),以便嘗試其他分支的路徑。

完整代碼

遞歸寫法,也可以用迭代

var binaryTreePaths = function(root) {let res = [];let path = [];function dfs(node) {if (node === null) returnpath.push(node.val);// 如果是葉子節點,就把路徑加入結果if (!node.left && !node.right) {res.push(path.join('->'));return}// 繼續遞歸左右子樹dfs(node.left);dfs(node.right);// 回溯path.pop();}dfs(root);return res;
};

時間復雜度分析

  • 遍歷了所有節點:O(N),其中 N 是節點數。

  • 每條路徑最長為樹高 H,每條路徑轉為字符串的時間是 O(H),總共最多 N 個葉子節點。
    所以最壞情況總時間為:O(N * H)

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

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

相關文章

自動化文檔生成工具(親測可運行)

本文介紹了一個用Java編寫的自動化文檔生成工具,通過讀取開發清單文本自動生成格式規范的Word文檔。該工具的主要特點包括: 采用Apache POI庫處理Word文檔,支持多級標題和段落自動生成實現中文數字轉換功能,將編號轉換為"一、…

湖北理元理律師事務所債務優化模型:法律與生活的平衡之道

在債務重組領域,專業機構需同時解決兩個矛盾:法律合規性與債務人可持續生存能力。湖北理元理律師事務所通過“三維干預模型”,在武漢某餐飲連鎖企業債務危機中驗證了該方案的有效性。 一、法律底層設計:還款方案的合法性審查 以該…

Web3-代幣ERC20/ERC721以及合約安全溢出和下溢的研究

Web3-代幣ERC20/ERC721以及合約安全溢出和下溢的研究 以太坊上的代幣 如果你對以太坊的世界有一些了解,你很可能聽人們聊過代幣— ERC20代幣 一個 代幣 在以太坊基本上就是一個遵循一些共同規則的智能合約——即它實現了所有其他代幣合約共享的一組標準函數&…

論文筆記 <交通燈><多智能體>MetaLight:基于價值的元強化學習用于交通信號控制

今天看的論文是這篇MetaLight:基于價值的元強化學習用于交通信號控制 里面提到的創新點就是MetaLight框架:他目標是讓交通信號控制智能體(Agent)在新路口(即使結構或流量模式不同)上能??快速學習??(Few…

華為OD-2024年E卷-尋找符合要求的最長子串[200分] -- python

問題描述: 給定一個字符串s,找出這樣一個子串: 1)該子串中的任意一個字符最多出現2次; 2)該子串不包含指定某個字符; 請你找出滿足該條件的最長子串的長度。 輸入描述 第一行為要求不包含的指定字符,為單個字符,取值范圍[0-9a-zA…

CppCon 2016 學習:What C++ Programmers Need to Know about Header <random>

隨機數生成的歷史背景 Middle-Square 方法(中位平方法): 已知最早的隨機算法之一或由修道士 Brother Edvin 在 1245 年發明由 John von Neumann 在 1949 年重新發現缺點明顯,但執行速度快 Monte Carlo 方法: 起初是…

Origin:誤差棒點線圖繪制

1.首先將你的數據復制到表格 2.選中B(y)列數據,依次點擊圖示選項 3.選中圖中紅框數據,點擊繪制點線圖即可 4.結果展示

Spring 源碼學習 1:ApplicationContext

Spring 源碼學習 1:ApplicationContext Bean 定義和 Bean 實例 AnnotationConfigApplicationContext 首先,創建一個最簡單的 Spring Boot 應用。 在入口類中接收SpringApplication.run的返回值: SpringBootApplication public class Dem…

CppCon 2017 學習:Design Patterns for Low-Level Real-Time Rendering

這段內容講的是離散顯卡(Discrete GPU)中的內存管理模型,重點是CPU和GPU各自獨立管理自己的物理內存,以及它們如何通過虛擬內存和DMA引擎實現高效通信。以下是詳細的理解和梳理: 1. 基本概念 CPU 和 GPU 是兩個獨立的…

【單調隊列】-----【原理+模版】

單調隊列 一、什么是單調隊列? 單調隊列是一種在滑動窗口或區間查詢中維護候選元素單調性的數據結構,通常用于解決“滑動窗口最大值/最小值”等問題。 核心思想是:利用雙端隊列(deque)維護當前窗口內或候選范圍內元素…

CSS語法中的選擇器與屬性詳解

CSS:層疊樣式表,Cascading Style Sheets 層疊樣式表 內容和樣式分離解耦,便于修改樣式。 特殊說明: 最后一條聲明可以沒有分號,但是為了以后修改方便,一般也加上分號為了使用樣式更加容易閱讀,可以將每條代…

模擬設計的軟件工程項目

考核題目 論文論述題:結合你 參與開發、調研或模擬設計的軟件工程項目 ,撰寫一篇論文 完成以下任務,論文題目為《面向微服務架構的軟件系統設計與建模分析》,總分: 100 分。 1. 考核內容: 一、系統論述…

個人理解redis中IO多路復用整個網絡處理流

文章目錄 1.redis網絡處理流2.理解通知機制 1.redis網絡處理流 10個客戶端通過TCP與Redis建立socket連接,發送GET name指令到服務器端。服務器端的網卡接收數據,數據進入內核態的網絡協議棧。Redis通過IO多路復用機制中的epoll向內核注冊監聽這些socket的…

【鄭州輕工業大學|數據庫】數據庫課設-酒店管理系統

該數據課設是一個基于酒店管理系統的數據庫設計 建庫語句 create database hotel_room default charset utf8 collate utf8_general_ci;建表語句 use hotel_room;-- 房型表 create table room_type( id bigint primary key auto_increment comment 房型id, name varchar(50)…

TCP 三次握手與四次揮手詳解

前言 在當今互聯網時代,前端開發的工作范疇早已超越了簡單的頁面布局和交互設計。隨著前端應用復雜度的不斷提高,對網絡性能的優化已成為前端工程師不可忽視的重要職責。而要真正理解并優化網絡性能,就需要探究支撐整個互聯網的基礎協議——…

RTD2735TD/RTD2738 (HDMI,DP轉EDP 高分辨率高刷新率顯示器驅動芯片)

一、芯片概述 RTD2738是瑞昱半導體(Realtek)推出的一款高性能顯示驅動芯片,專為高端顯示器、便攜屏、專業顯示設備及多屏拼接系統設計。其核心優勢在于支持4K分辨率下240Hz高刷新率及8K30Hz顯示,通過集成DisplayPort 1.4a與HDMI …

C++實現手寫strlen函數

要實現求字符串長度的函數&#xff0c;核心思路是通過指針或索引遍歷字符串&#xff0c;直到遇到字符串結束標志 \0 。以下是兩種常見的實現方式&#xff1a; 指針遍歷版本 #include <iostream> using namespace std; // 指針方式實現strlen size_t myStrlen(const cha…

NVPL 函數庫介紹和使用

文章目錄 NVPL 函數庫介紹和使用什么是 NVPLNVPL 的主要組件NVPL 的優勢安裝 NVPL基本使用示例示例1&#xff1a;使用 NVPL RAND 生成隨機數示例2&#xff1a;使用 NVPL FFT 進行快速傅里葉變換 編譯 NVPL 程序性能優化建議總結 NVPL 函數庫介紹和使用 什么是 NVPL NVPL (NVI…

HTTP相關內容補充

目錄 一、URI 和 URL 二、使用 Cookie 的狀態管理 三、返回結果的 HTTP狀態碼 一、URI 和 URL URI &#xff1a;統一資源標識符 URL&#xff1a;統一資源定位符 URI 格式 登錄信息&#xff08;認證&#xff09;指定用戶名和密碼作為從服務器端獲取資源時必要的登錄信息&a…

MySQL: Invalid use of group function

https://stackoverflow.com/questions/2330840/mysql-invalid-use-of-group-function 出錯SQL: 錯誤原因&#xff1a; 1. 不能在 WHERE 子句中使用聚合&#xff08;或分組&#xff09;函數 2. HAVING 只能篩選分組后的聚合結果或分組字段 # Write your MySQL query statem…