1028. 從先序遍歷還原二叉樹(三種方法:棧+遞歸+集合)

文章目錄

  • 1028. 從先序遍歷還原二叉樹(三種方法:棧+遞歸+集合)
    • 一、棧+ while迭代
      • 1.思路
      • 2.代碼
    • 二、遞歸法
      • 1.思路
      • 2.代碼
    • 三、集合存儲
      • 1.思路
      • 2.代碼


1028. 從先序遍歷還原二叉樹(三種方法:棧+遞歸+集合)


在這里插入圖片描述
在這里插入圖片描述

一、棧+ while迭代

1.思路

1.遍歷整個字符串,從0開始,根節點在第0層
2.用level記錄層數,每遇到一個-字符,當前層數+1
3.用val記錄要插入的結點的值,遍歷取到的數字,通過字符運算得到值。
4.找到當前要插入結點的父結點,棧的大小要小于當前層數
5.如果節點只有一個子節點,那么保證該子節點為左子節點。
6.將創建的新結點入棧
7.除了根節點,其他子節點全部出棧,返回根節點

2.代碼

    public TreeNode recoverFromPreorder(String traversal) {Stack<TreeNode> stack = new Stack<>();//用棧來存儲結點for (int i = 0; i < traversal.length(); ) {//遍歷整個字符串,從0開始,根節點在第0層int level = 0;//記錄當前層數while (traversal.charAt(i) == '-') {//每遍歷到一個-,層數累加level++;i++;}int val = 0;//查看當前要插入結點的數字while (i < traversal.length() && traversal.charAt(i) != '-') {//當前的字符是數字,并且未超過字符串val = val * 10 + (traversal.charAt(i) - '0');//根據字符的相加,遍歷字符串找數字時 只能一個數字一個數字的轉,// 但是字符串中連續的數字是一個多位數,需要前面的數字*10變高位,再加上后面的數,// 成為一個數,作為新結點的值i++;}while (stack.size() > level) {stack.pop();//找到當前要插入結點的父結點}TreeNode node = new TreeNode(val);//創建新結點if (!stack.isEmpty()) {//如果節點只有一個子節點,那么保證該子節點為左子節點。if (stack.peek().left == null) {stack.peek().left = node;} else {stack.peek().right = node;}}stack.add(node);//入棧}while (stack.size() > 1) {stack.pop();//要返回根節點,出到棧只有一個結點}return stack.pop();}

二、遞歸法

1.思路

1.利用helper函數,根據字符和對應深度創建結點,還原二叉樹
2.每遇到-字符,層數加一
3.如果遍歷的深度和獲取到的深度不一致,返回空
4.當深度等于層數時,下一個結點的位置從index + level開始
5.通過字符運算獲取數字,同時創建結點
6.根節點的左樹調用helper函數遞歸,如果左子節點是空,那么右子節點肯定也是空的
7.如果根節點的左樹不為空,要想添加結點,遞歸右樹。
8.最終返回根節點

2.代碼

    //102. 二叉樹的層序遍歷---遞歸寫法int index = 0;//index記錄遍歷到字符串的哪個位置public TreeNode recoverFromPreorder3(String traversal) {return helper(traversal,0);}public TreeNode helper(String s, int depth) {//helper函數用來創建二叉樹int level = 0;//記錄層數while (index + level < s.length() && s.charAt(index + level) == '-') {level++;}//如果遍歷的深度和獲取到的深度不一致,返回空if (level != depth){return null;}int next = index + level;//獲取數字while (next < s.length() && s.charAt(next) != '-')next++;int val = Integer.parseInt(s.substring(index + level, next));index = next;//創建結點TreeNode root = new TreeNode(val);root.left = helper(s, depth + 1);if (root.left == null) {//如果左子節點是空,那么右子節點肯定也是空的root.right = null;} else {root.right = helper(s, depth + 1);}return root;}

三、集合存儲

1.思路

1.使用正則匹配把字符串S拆成不同的數字存進數組中,用集合list來存儲結點
2.將根節點添加到list中,層數從1開始,不包括根節點
3.數組存儲的位置不為空時,根據轉換的值創建結點
4.將結點加入到集合中
5.獲取父結點,插入結點,并從新設置層數,果滿了,層數加一
6.最終返回根節點

2.代碼

    //102. 二叉樹的層序遍歷--正則匹配public TreeNode recoverFromPreorder2(String traversal) {String[] valus = traversal.split("-");//使用正則匹配把字符串S拆成不同的數字,用集合list來存儲結點List<TreeNode> list = new ArrayList<>();list.add(new TreeNode(Integer.valueOf(valus[0])));//根節點//根節點添加到list中int level = 1;//層數層1開始,不包括根節點for (int i = 1; i < valus.length; i++) {if (!valus[i].isEmpty()) {//數組存儲的位置不為空TreeNode node = new TreeNode(Integer.valueOf(valus[i]));//根據轉化的值,創建結點//因為是前序遍歷,每層我們只需要存儲一個結點即可,這個節點值有可能//會被覆蓋,如果被覆蓋了說明這個節點以及他的子節點都以及遍歷過了,//所以不用考慮被覆蓋問題list.add(level, node);//將結點加入到集合中TreeNode parent = list.get(level - 1);//獲取父結點,插入結點,并從新設置層數if (parent.left == null) {parent.left = node;} else {parent.right = node;}level = 1;} else {level++;//如果滿了,層數加一}}return list.get(0);}

點擊移步博客主頁,歡迎光臨~

偷cyk的圖

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

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

相關文章

hive報錯:FAILED: NullPointerException null

發現問題 起因是我虛擬機的hive不管執行什么命令都報空指針異常的錯誤 我也在網上找了很多相關問題的資料&#xff0c;發現都不是我這個問題的解決方法&#xff0c;后來在hive官網上與hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本還是2.7.2的版本…

HTTPS的加密過程

文章目錄 前言一、為什么需要加密&#xff1f;二、只用對稱加密可以嗎&#xff1f;三、只使用非對稱加密四、雙方都使用非對稱加密五、使用非對稱加密對稱加密六、引入證書1.如何放防止數字證書被篡改&#xff1f;2.中間人有可能篡改該證書嗎&#xff1f;3.中間人有可能掉包該證…

開窗函數rank() over,dense_rank() over,row_number() over的區別

1.rank() over 查詢出指定的條件進行排名&#xff0c;條件相同排名相同的話&#xff0c;排名之間是不連續的 例如排名如 1 2 3 3 5 6 7 等&#xff0c;相同的排名會自動跳過 2.dense_rank() over 查詢出指定的條件后進行排名&#xff0c;條件相同&#xff0c;排名相同的話&…

【YOLO系列】YOLOv9論文超詳細解讀(翻譯 +學習筆記)

前言 時隔一年&#xff0c;YOLOv8還沒捂熱&#xff0c;YOLO系列最新版本——YOLOv9 終于閃亮登場&#xff01; YOLOv9的一作和v7一樣。v4也有他。 他于2017年獲得臺灣省National Central University計算機科學與信息工程博士學位&#xff0c;現在就職于該省Academia Sinica的…

【大數據】Flink SQL 語法篇(六):Temporal Join

《Flink SQL 語法篇》系列&#xff0c;共包含以下 10 篇文章&#xff1a; Flink SQL 語法篇&#xff08;一&#xff09;&#xff1a;CREATEFlink SQL 語法篇&#xff08;二&#xff09;&#xff1a;WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 語法篇&#xff08;三&…

機器視覺——硬件選型

1、相機選型 在選擇機器視覺相機時&#xff0c;通常需要考慮以下幾個方面&#xff1a; 1、分辨率&#xff1a;相機的分辨率決定了其拍攝圖像的清晰度和細節程度。根據具體的應用需求&#xff0c;可以選擇適當的分辨率范圍。 2、幀率&#xff1a;幀率表示相機每秒鐘能夠拍攝的…

2023年營養保健品線上電商市場行業分析(2024年營養保健行業未來趨勢分析)

近年來&#xff0c;受人口老齡化、養生年輕化等因素驅動&#xff0c;保健品行業增長強勁&#xff0c;加之越來越多的年輕人也加入養生大軍&#xff0c;成為保健品市場上的一股新力量&#xff0c;進一步帶動市場擴容。 鯨參謀數據顯示&#xff0c;2023年度&#xff0c;京東平臺…

[pdf]《軟件方法》2024版部分公開-共196頁

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 潘加宇《軟件方法》2024版部分公開pdf文件&#xff0c;共196頁&#xff0c;已上傳CSDN資源。 也可到以下地址下載&#xff1a; http://www.umlchina.com/url/softmeth2024.html 如果…

Ubuntu20.04 ssh終端登錄后未自動執行.bashrc

sudo vim ~/.profile輸入以下內容 if [ -n "$BASH_VERSION" ]; then if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi 執行 source ~/.profile重新測試 其他答案 如果你的~/.bashrc文件在Ubuntu中沒有自動生效&#xff0c;…

3. 文檔概述(Documentation Overview)

3. 文檔概述&#xff08;Documentation Overview&#xff09; 本章節簡要介紹一下Spring Boot參考文檔。它包含本文檔其它部分的鏈接。 本文檔的最新版本可在 docs.spring.io/spring-boot/docs/current/reference/ 上獲取。 3.1 第一步&#xff08;First Steps&#xff09; …

解析電源模塊測試條件與測試步驟 快速完成測試

高溫高濕儲存測試是電源模塊環境適應性測試內容之一&#xff0c;在實際使用過程中由于應用場景不同電源所處的環境也是多樣的&#xff0c;因此需要測試電源對各種環境的適應能力&#xff0c;提高電源的性能和可靠性。 電源高溫高濕存儲測試的目的是為了測量環境對電源結構、元件…

C語言第三十三彈---動態內存管理(上)

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】 動態內存管理 1、為什么要有動態內存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常見的動態內存的錯…

氣象數據收集

1、國家氣象科學數據中心 預報數據:需要定制,收費10萬+ 觀測數據:國家氣象信息中心-中國氣象數據網 (cma.cn)https://data.cma.cn/data/cdcdetail/dataCode/A.0012.0001.html 地面基本氣象觀測數據 滯后2天 滯后一天 路面數據同化系統,實時 國家氣象信息中心-中國氣象數…

11.以太網交換機工作原理

目錄 一、以太網協議二、以太網交換機原理三、交換機常見問題思考四、同網段數據通信全過程五、跨網段數據通信全過程六、關鍵知識七、調試命令 前言&#xff1a;在網絡中傳輸數據時需要遵循一些標準&#xff0c;以太網協議定義了數據幀在以太網上的傳輸標準&#xff0c;了解以…

android移動應用開發基礎答案,安卓工程師面試題

一線企業的app都是多線程和多進程的&#xff0c;而Android進程間通信機制就是Binder&#xff0c;原生的線程間通信則是Handler&#xff0c;Binder和Handler是了解安卓運行機制必須要掌握的一個知識點&#xff0c;更是一線企業面試必問的知識點&#xff01; 以下幾道就是大廠關于…

【QT+QGIS跨平臺編譯】之五十五:【QGIS_CORE跨平臺編譯】—【qgsmeshcalcparser.cpp生成】

文章目錄 一、Bison二、生成來源三、構建過程一、Bison GNU Bison 是一個通用的解析器生成器,它可以將注釋的無上下文語法轉換為使用 LALR (1) 解析表的確定性 LR 或廣義 LR (GLR) 解析器。Bison 還可以生成 IELR (1) 或規范 LR (1) 解析表。一旦您熟練使用 Bison,您可以使用…

Unity中URP實現水體(整理優化)

文章目錄 前言一、優化水的深度1、我們把 水流動的方向 和 水深淺過渡值&#xff0c;整合到一個四維變量中2、修改 水體流動方向3、在片元著色器中&#xff0c;修改使用過渡變量 二、優化泡沫三、優化水下的扭曲1、修復原本擾動UV的計算 四、優化水面高光1、把高光強度、光滑度…

紅隊基礎設施建設

文章目錄 一、ATT&CK二、T1583 獲取基礎架構2.1 匿名網絡2.2 專用設備2.3 滲透測試虛擬機 三、T1588.002 C23.1 開源/商用 C23.1.1 C2 調研SliverSliver 對比 CS 3.1.2 CS Beacon流量分析流量規避免殺上線 3.1.3 C2 魔改3.1.4 C2 隱匿3.1.5 C2 準入應用場景安裝配置說明工具…

UC++對象方法IsValid()、IsValidLowLevel()、IsValidLowLevelFast()的區別

在 Unreal Engine 中&#xff0c;IsValid(), IsValidLowLevel(), 和 IsValidLowLevelFast() 是用于檢查 UObject&#xff08;Unreal Object&#xff09;有效性的三個不同的方法。它們之間的區別主要在于檢查的級別和效率。 IsValid()&#xff1a; 檢查級別&#xff1a; IsVal…

深度學習 精選筆記(2)自動求導與概率

學習參考&#xff1a; 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增)&#xff0c;以達到集多方教程的精華于一文的目的。 ③非常推薦上面&#xff08;學習參考&#x…