LeetCode題練習與總結:二叉樹的前序遍歷--144

一、題目描述

給你二叉樹的根節點?root?,返回它節點值的?前序?遍歷。

示例 1:

輸入:root = [1,null,2,3]
輸出:[1,2,3]

示例 2:

輸入:root = []
輸出:[]

示例 3:

輸入:root = [1]
輸出:[1]

示例 4:

輸入:root = [1,2]
輸出:[1,2]

示例 5:

輸入:root = [1,null,2]
輸出:[1,2]

提示:

  • 樹中節點數目在范圍?[0, 100]?內
  • -100 <= Node.val <= 100

二、方法一:遞歸方法

(一)解題思路

遞歸方法是最直觀的,按照前序遍歷的順序,遞歸地訪問每個節點:

  1. 如果當前節點為空,返回。
  2. 訪問當前節點,將節點的值添加到結果列表中。
  3. 遞歸地前序遍歷左子樹。
  4. 遞歸地前序遍歷右子樹。

(二)具體代碼

import java.util.ArrayList;
import java.util.List;public class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preorder(root, result);return result;}private void preorder(TreeNode node, List<Integer> result) {if (node == null) {return;}result.add(node.val); // 訪問根節點preorder(node.left, result); // 遍歷左子樹preorder(node.right, result); // 遍歷右子樹}
}

(三)時間復雜度和空間復雜度

1. 時間復雜度
  • 原因:遞歸方法訪問樹中每個節點一次。
  • 計算:對于具有N個節點的二叉樹,每個節點都恰好被訪問一次。
  • 結果:時間復雜度為O(N),其中N是二叉樹中節點的數量。
2. 空間復雜度
  • 原因:遞歸方法使用棧空間來存儲遞歸調用的信息,其大小取決于樹的高度。
  • 最壞情況:如果樹完全不平衡,每個節點只有左子節點或只有右子節點,遞歸棧的深度將達到N
  • 最好情況:如果樹是完全平衡的,遞歸棧的深度將是logN
  • 額外空間:代碼中沒有使用除了遞歸棧以外的額外空間。
  • 結果:空間復雜度介于O(logN)O(N)之間,取決于樹的形狀。額外空間復雜度是O(1)
3. 總結
  • 時間復雜度O(N)
  • 空間復雜度O(1)(額外空間),O(logN)O(N)(遞歸棧空間)

(四)總結知識點

  1. 遞歸:這是一種編程技巧,允許函數調用自身。在這個代碼中,preorder函數會遞歸地調用自身來遍歷二叉樹的每個節點。

  2. 二叉樹遍歷:代碼實現了二叉樹的前序遍歷,這是一種深度優先遍歷策略,按照“根-左-右”的順序訪問樹的節點。

  3. 二叉樹節點定義:代碼中使用了TreeNode類來定義二叉樹的節點,每個節點包含一個整數值val和兩個指向其左右子節點的指針leftright

  4. Java集合框架:代碼使用了ArrayList來存儲遍歷的結果。ArrayList是Java集合框架中的一個可調整大小的數組實現,用于存儲對象列表。

  5. 函數參數傳遞:代碼中的preorder函數接受一個TreeNode類型的參數和一個List<Integer>類型的參數,這展示了如何在Java中傳遞和修改對象引用。

  6. 基本語法結構:代碼包含了基本的Java語法結構,如類的定義、方法的定義、條件語句(if)、返回語句(return)和列表的添加操作(result.add)。

  7. 遞歸的基本條件:在preorder函數中,遞歸的基本條件是當遇到一個null節點時返回,這避免了遞歸調用的無限循環。

  8. 方法重載Solution類中有兩個名為preorder的方法,但它們的參數列表不同,這是Java方法重載的例子。一個方法是公共的,用于外部調用,另一個方法是私有的,作為輔助方法用于遞歸遍歷。

三、方法二:迭代方法

(一)解題思路

迭代方法通常使用棧來模擬遞歸過程:

  1. 創建一個空棧,將根節點壓入棧中。
  2. 當棧不為空時,彈出棧頂元素,訪問該節點,并將其值添加到結果列表中。
  3. 先將彈出節點的右子節點(如果有)壓入棧中,然后將左子節點(如果有)壓入棧中。這樣可以保證左子節點先被訪問。
  4. 重復步驟2和3,直到棧為空。

(二)具體代碼

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;public class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if (root != null) {stack.push(root);}while (!stack.isEmpty()) {TreeNode node = stack.pop();result.add(node.val); // 訪問節點if (node.right != null) {stack.push(node.right); // 右子節點先入棧}if (node.left != null) {stack.push(node.left); // 左子節點后入棧}}return result;}
}

(三)時間復雜度和空間復雜度

1. 時間復雜度
  • 原因:迭代方法訪問樹中每個節點一次。
  • 計算:對于具有N個節點的二叉樹,每個節點都恰好被訪問一次。
  • 結果:時間復雜度為O(N),其中N是二叉樹中節點的數量。
2. 空間復雜度
  • 原因:迭代方法使用棧空間來存儲待訪問的節點,其大小取決于樹的高度。
  • 最壞情況:如果樹完全不平衡,每個節點只有左子節點或只有右子節點,棧的深度將達到N
  • 最好情況:如果樹是完全平衡的,棧的深度將是logN
  • 結果:空間復雜度介于O(logN)O(N)之間,取決于樹的形狀。
3. 總結
  • 時間復雜度O(N)
  • 空間復雜度O(logN)O(N)

(四)總結知識點

  1. 迭代方法:與遞歸方法不同,迭代方法使用棧來模擬遞歸過程,用于遍歷二叉樹的節點。

  2. 棧數據結構:代碼使用了Stack類來存儲待訪問的節點。棧是一種后進先出(LIFO)的數據結構,用于在迭代過程中保持節點的訪問順序。

  3. 二叉樹遍歷:代碼實現了二叉樹的前序遍歷,按照“根-左-右”的順序訪問樹的節點。

  4. 二叉樹節點定義:代碼中使用了TreeNode類來定義二叉樹的節點,每個節點包含一個整數值val和兩個指向其左右子節點的指針leftright

  5. Java集合框架:代碼使用了ArrayList來存儲遍歷的結果。ArrayList是Java集合框架中的一個可調整大小的數組實現,用于存儲對象列表。

  6. 條件語句:代碼中的if語句用于檢查當前節點是否有左右子節點,以便將它們添加到棧中。

  7. 循環結構while循環用于在棧不為空的情況下繼續遍歷二叉樹的節點。

  8. 基本語法結構:代碼包含了基本的Java語法結構,如類的定義、方法的定義、棧的操作(pushpop)以及列表的添加操作(result.add)。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

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

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

相關文章

數據資產的創新應用與未來展望:探討數據資產在人工智能、物聯網等新興領域的應用前景,提出前瞻性的數據資產解決方案,為企業探索新的增長點,推動行業創新發展

目錄 一、引言 二、數據資產在人工智能領域的應用 1、機器學習與深度學習 2、自然語言處理 3、計算機視覺 三、數據資產在物聯網領域的應用 1、智能家居 2、工業物聯網 3、智慧城市 四、前瞻性的數據資產解決方案 1、構建統一的數據管理平臺 2、加強數據安全和隱私…

webpack源碼解析---addEntry

addEntry EntryPlugin的注冊 webpack會從入口開始解析依賴。 WebpackOptionsApply new WebpackOptionsApply().process(compiler, options); class WebpackOptionsApply {constructor () {}process () {// 注冊 EntryOptionPlugin new EntryOptionPlugin().apply(compiler);}…

基于路徑長度的樣條插補算法(自動駕駛和路徑跟蹤控制適用)

以前在做車輛跟蹤控制的時候發現在針對有多個X和多個Y對應的路徑插補時候&#xff0c;總是報錯&#xff0c;因為MATLAB里面的interp1插補函數它要求x要唯一對應一個y&#xff0c;當路徑以單獨的x或者y來求插補時候的時候就報錯。由于在使用Matlab的interp1函數進行插值時&#…

怎樣才能更好地保護個人賬號的安全

怎樣才能更好地保護個人賬號的安全 保護個人賬號安全是網絡安全的重要組成部分&#xff0c;以下是一些有效的措施來增強賬號的安全性&#xff1a; 1. 使用強密碼 復雜性&#xff1a;創建包含大小寫字母、數字和特殊字符的密碼。長度&#xff1a;密碼至少應有12個字符長。唯一…

談談檢測瀏覽器類型

前幾天被問到如何檢測瀏覽器類型&#xff0c;我突然發現我對此并不了解&#xff0c;之前的項目中也沒有使用到過&#xff0c;只隱約記得通過一個自帶的方法即可獲取。所以今天特意來仔細補習一下。 核心&#xff1a;navigator.userAgent 1.正則表達式 2.引用外部庫 3.判斷瀏…

【Android面試八股文】你知道什么是冷啟動和熱啟動嗎?你知道應用冷啟動的全流程嗎?你知道如何解決啟動時候的黑白屏問題?

文章目錄 一、冷啟動、熱啟動的概念二、冷啟動的流程冷啟動啟動流程:流程細節三、如何解決啟動時候的黑白屏問題?一、冷啟動、熱啟動的概念 在Android開發中,冷啟動和熱啟動是兩個重要的概念,它們描述了應用程序啟動時不同的狀態和表現: 冷啟動(Cold Start): 冷啟動指…

記一次kafka使用不當導致的服務器異常

一、背景 1.運維反饋服務器cpu高&#xff0c;且高達80% 2.經過排查發現kafka出現消息積壓情況 3.使用的是springboot kafka框架 dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency…

Linux-網絡安全私房菜

文章目錄 前言入門基本指令篇章字符集設置cdlsdatemkdirtouch-d-m 修改主機名rmshredrename重命名mv移動tar打包與壓縮打包但是不壓縮打包且壓縮更新包文件解壓對應的包 zip壓縮文件命令cat查看顯示行號交互寫入&#xff08;追加&#xff09;顯示空行 more和lesshead和tailhead…

Android的懸浮時鐘(一)

在Android&#xff0c;如果要懸浮在其他應用上方顯示時鐘或者其他界面的話是需要申請權限的。 首先在manifest中我們就要寫自己要申請的權限SYSTEM_ALERT_WINDOW <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" /> 不同于請求照片或…

期末復習---程序填空

注意&#xff1a; 1.數組后移 *p *(p-1) //把前一個數賦值到后一個數的位置上來覆蓋后一個數 2.指針找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指針指向這個已經找到的最大位置&#xff1b;!!!!!!!!! } p; //因為開始沒有next &#xff…

Web工程化

1、webpack 1.1 概念 一個前端打包器。 webpack 只識別javascript. 所以需要安裝nodejs環境。 1.2 運行環境 Nodejs Nodejs 是運行JavaScript的環境。 因為nodejs發布了許多版本&#xff0c;在不同的技術棧下&#xff0c;需要使用不同的nodejs。 所以需要在電腦上安裝n…

web應用技術-第十一次課后作業

驗證過濾器進行權限驗證的原理。 Filter過濾器&#xff1a;可以把對資源的請求攔截下來&#xff0c;從而實現一些特殊的功能。一般完成登錄校驗、統一編碼處理、敏感字符處理等通用操作。 定義&#xff1a;實現Filter接口 配置&#xff1a;WebFilter(urlPatterns"/*&qu…

常見VPS主機術語有哪些?VPS術語解析

常見VPS主機術語有哪些&#xff1f;本期為大家解析一下我們常見到的聽到的VPS專業術語&#xff0c;幫助大家更輕松的了解VPS主機相關知識。 常見VPS主機術語 Apache – 世界上最流行的 Web 服務器軟件。 CentOS – 旨在提供基于 Red Hat Enterprise Linux 的企業級操作系統的…

mysql 主主HA高可用方案詳解

1.環境準備&#xff1a; 主機&#xff1a;1921.4,1921.5 操作系統&#xff1a;centos 7.3 mysql數據庫版本&#xff1a;mysql 5.7.13 浮動IP:1921.182 2.mysql 下載及解壓安裝配置 2.1 下載&#xff1a; #wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13-linu…

easyexcel 模板填充Excel數據,實現自定義換行及動態調整行高,并保持列表格式一致

pom依賴&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version> </dependency><dependency><groupId>com.alibaba</groupId><artifa…

數據結構-線性表的應用

目錄 前言一、有序表的合并1.1 順序表實現1.2 單鏈表實現 二、稀疏多項式的相加和相乘2.1 稀疏多項式的相加2.2 稀疏多項式的相乘 總結 前言 本篇文章介紹線性表的應用&#xff0c;分別使用順序表和單鏈表實現有序表的合并&#xff0c;最后介紹如何使用單鏈表實現兩個稀疏多項…

基于springboot+vue+uniapp的超市售貨管理平臺

開發語言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

考研生活day2--王道課后習題2.3.1、2.3.2、2.3.3

2.3.1 題目描述&#xff1a; 這題和曾經做過的LeetCode203.移除元素一模一樣&#xff0c;所以我們就使用LeetCode進行書寫&#xff0c;題目鏈接203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 解題思路 大家的第一反應肯定是根據書上所學的書寫方法一樣書寫&…

【PB案例學習筆記】-26制作一個帶浮動圖標的工具欄

寫在前面 這是PB案例學習筆記系列文章的第26篇&#xff0c;該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習&#xff0c;提高編程技巧&#xff0c;以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼&#xff0c;小凡都上傳到了gite…

爬蟲cookie是什么意思

“爬蟲 cookie”指的是網絡爬蟲在訪問網站時所使用的cookie&#xff0c;網絡爬蟲是一種自動化程序&#xff0c;用于在互聯網上收集信息并進行索引&#xff0c;這些信息可以用于搜索引擎、數據分析或其他目的。 本教程操作系統&#xff1a;Windows10系統、Dell G3電腦。 “爬蟲…