數據結構------二叉樹經典習題2


?博主主頁:?碼農派大星.

關注博主帶你了解更多數據結構知識


1.非遞歸的前序遍歷

1.用棧來實現

2,前序遍歷是根左右, 先是根節點入棧,,然后不為空時向左遍歷,當為空時就返回向右遍歷,右為空時直接出棧,依次循環即可.

public void preOrderNot(TreeNode root){Stack<TreeNode> stack = new Stack<>();if(root==null){return;}TreeNode cur = root;while (cur != null || !stack.isEmpty()){while (cur != null){stack.push(cur);System.out.print(cur.val + " ");cur = cur.left;}TreeNode top = stack.pop();cur = top.right;}}

2.非遞歸的中序遍歷

1和前序遍歷不同的是,中序遍歷是左根右

2先讓左節點入棧,一直往左遍歷,直到遇到空時,返回根節點,再向右一直遍歷,遇到右為空時,出棧.

public void inOrderNot(TreeNode root) {Stack<TreeNode> stack = new Stack<>();if(root==null){return;}TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);cur = cur.left;}TreeNode top = stack.pop();System.out.print(top.val + " ");cur = top.right;}}

3.非遞歸的后序遍歷

后序遍歷是左右根,我們先讓左節點入棧,再一直向左遍歷,當為空的時候需要peek一下判斷右節點是否為空,如果右節點為空則出棧,如果右節點不為空那么遍歷右節點.

注意:

當右節點不為空遍歷右節點的時候,可能造成死循環,所以我們需要定義一個prev值來表示最后一個被打印的節點。

 public void PostOrderNot(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode prev = null;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);cur = cur.left;}TreeNode top = stack.peek();if (top.right == null || top.right == prev) {//打印當前top 并彈出stack.pop();System.out.print(top.val + " ");prev = top;} else {cur = top.right;}
}

4.根據二叉樹創建字符串OJ鏈接

給你二叉樹的根節點?root?,請你采用前序遍歷的方式,將二叉樹轉化為一個由括號和整數組成的字符串,返回構造出的字符串。

空節點使用一對空括號對?"()"?表示,轉化后需要省略所有不影響字符串與原始二叉樹之間的一對一映射關系的空括號對。

解題:先遍歷左 如果左不為空為(root.left),如果為空,判斷右是否為空,如果為空(就是左右都為空)什么都不返回,不為空返回()

再處理右樹,如果為空什么都不返回,如果不為空返回(root.right)

class Solution {public String tree2str(TreeNode root) {StringBuilder stringBuilder = new StringBuilder();tree2strChild(root,stringBuilder);return stringBuilder.toString();}private void tree2strChild(TreeNode root,StringBuilder stringBuilder){if(root == null)return;stringBuilder.append(root.val);if(root.left != null){stringBuilder.append("(");tree2strChild(root.left,stringBuilder);stringBuilder.append(")");}else{//左邊為空 右也為空if(root.right == null){return;}else{stringBuilder.append("()");}}//處理root右樹情況if(root.right == null){return;}else{stringBuilder.append("(");tree2strChild(root.right,stringBuilder);stringBuilder.append(")");}      }
}

?5.根據一棵樹的前序遍歷與中序遍歷構造二叉樹OJ鏈接

class Solution {public int preIndex;public TreeNode buildTree(int[] preorder, int[] inorder) {return buildTreeChilde(preorder,inorder,0,inorder.length-1);   }private TreeNode buildTreeChilde(int[] preorder,int[] inorder,int inBegin,int inEnd){if(inBegin > inEnd){return null;}        TreeNode root = new TreeNode(preorder[preIndex]);int rootIndex = findRootIndex(inorder,inBegin,inEnd,preorder[preIndex]);  preIndex++;root.left = buildTreeChilde(preorder,inorder,inBegin,rootIndex-1);root.right = buildTreeChilde(preorder,inorder,rootIndex+1,inEnd);return root;}private int findRootIndex(int[] inorder,int inBegin,int inEnd,int Key){for(int i = inBegin; i<= inEnd;i++){if(inorder[i] == Key){return i;}}return -1;}
}

?6.根據一棵樹的中序遍歷與后序遍歷構造二叉樹OJ鏈接

class Solution {public int  postIndex = 0;public TreeNode buildTree(int[] inorder, int[] postorder) {postIndex = postorder.length-1;return buildTreeChild(inorder,postorder,0,inorder.length-1);}private TreeNode buildTreeChild(int[] inorder,int[] postorder,int inBegin,int inEnd){if(inBegin > inEnd){return null;}TreeNode root = new TreeNode(postorder[postIndex]);int rootIndex = findRootIndex(inorder,inBegin, inEnd,postorder[postIndex]);postIndex--;root.right = buildTreeChild(inorder,postorder,rootIndex+1,inEnd);root.left = buildTreeChild(inorder,postorder,inBegin,rootIndex-1);return root;}private int findRootIndex(int[] inorder,int inBegin,int inEnd,int Key){for(int i = inBegin; i<= inEnd;i++){if(inorder[i] == Key){return i;}}return -1;}
}

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

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

相關文章

科技賦能,打破視障人士的溝通壁壘

在探索如何增強盲人群體的社會參與度與幸福感的旅程中&#xff0c;盲人社交能力提升策略成為了不容忽視的一環。隨著科技的不斷進步&#xff0c;像“蝙蝠避障”這樣的輔助軟件&#xff0c;不僅在日常出行中為盲人提供了實時避障和拍照識別的便利&#xff0c;也在無形中為他們拓…

華為數通 HCIP-Datacom(H12-821)題庫

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整題庫請掃描上方二維碼訪問&#xff0c;持續更新中。 BGP路由的Update消息中可不包含以下哪些屬性&#xff1f; A、Local Preference B、AS Path C、MED D、Origin 答案&#xff1a;AC 解析&#xff1a;as-path和ori…

深度學習訓練框架——監督學習為例

訓練框架 文章目錄 訓練框架1. 模型網絡結構2. 數據讀取與數據加載2.1Dataloater參數2.2 collate_fn 3. 優化器與學習率調整3.1 優化器3.2 學習率調度 4迭代訓練4.1 train_epoch4.2 train iteration 5.1 保存模型權重 本文內容以pytorch為例 1. 模型網絡結構 自定義網絡模型繼…

測試開發面試題

簡述自動化測試的三大等待 強制等待。直接使用time.sleep()方法讓程序暫停指定的時間。優點是實現簡單&#xff0c;缺點是不夠靈活&#xff0c;可能會導致不必要的等待時間浪費。隱式等待。設置一個固定的等待時間&#xff0c;在這個時間內不斷嘗試去查找元素&#xff0c;如果…

Java17 --- SpringCloud之Sentinel

目錄 一、Sentinel下載并運行 二、創建8401微服務整合Sentinel 三、流控規則 3.1、直接模式 3.2、關聯模式 3.3、鏈路模式 3.3.1、修改8401代碼 3.3.2、創建流控模式 3.4、Warm UP&#xff08;預熱&#xff09; ?編輯 3.5、排隊等待 四、熔斷規則 4.1、慢調用比…

【C++】09.vector

一、vector介紹和使用 1.1 vector的介紹 vector是表示可變大小數組的序列容器。就像數組一樣&#xff0c;vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問&#xff0c;和數組一樣高效。但是又不像數組&#xff0c;它的大小是可以動態改…

操作系統實驗四 (綜合實驗)設計簡單的Shell程序

前言 因為是一年前的實驗&#xff0c;很多細節還有知識點我都已經遺忘了&#xff0c;但我還是盡可能地把各個細節講清楚&#xff0c;請見諒。 1.實驗目的 綜合利用進程控制的相關知識&#xff0c;結合對shell功能的和進程間通信手段的認知&#xff0c;編寫簡易shell程序&…

Excel透視表:快速計算數據分析指標的利器

文章目錄 概述1.數據透視表基本操作1.1準備數據&#xff1a;1.2創建透視表&#xff1a;1.3設置透視表字段&#xff1a;1.4多級分類匯總和交叉匯總的差別1.5計算匯總數據&#xff1a;1.6透視表美化&#xff1a;1.7篩選和排序&#xff1a;1.8更新透視表&#xff1a; 2.數據透視-數…

【B站 heima】小兔鮮Vue3 項目學習筆記Day02

文章目錄 Pinia1.使用2. pinia-計數器案例3. getters實現4. 異步action5. storeToRefsx 數據解構保持響應式6. pinia 調試 項目起步1.項目初始化和git管理2. 使用ElementPlus3. ElementPlus 主題色定制4. axios 基礎配置5. 路由設計6. 靜態資源初始化和 Error lens安裝7.scss自…

Github 2024-05-24 開源項目日報 Top10

根據Github Trendings的統計,今日(2024-05-24統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目3非開發語言項目2TypeScript項目2JavaScript項目1Kotlin項目1C#項目1C++項目1Shell項目1Microsoft PowerToys: 最大化Windows系統生產…

軟件設計師備考筆記(十):網絡與信息安全基礎知識

文章目錄 一、網絡概述二、網絡互連硬件&#xff08;一&#xff09;網絡的設備&#xff08;二&#xff09;網絡的傳輸介質&#xff08;三&#xff09;組建網絡 三、網絡協議與標準&#xff08;一&#xff09;網絡的標準與協議&#xff08;二&#xff09;TCP/IP協議簇 四、Inter…

某神,云手機啟動?

某神自從上線之后&#xff0c;熱度不減&#xff0c;以其豐富的內容和獨特的魅力吸引著眾多玩家&#xff1b; 但是隨著劇情無法跳過&#xff0c;長草期過長等原因&#xff0c;近年脫坑的玩家多之又多&#xff0c;之前米家推出了一款云某神的app&#xff0c;目標是為了減少用戶手…

RedisTemplateAPI:String

文章目錄 ?1 String 介紹?2 命令?3 對應 RedisTemplate API???? 3.1 添加緩存???? 3.2 設置過期時間(單獨設置)???? 3.3 獲取緩存值???? 3.4 刪除key???? 3.5 順序遞增???? 3.6 順序遞減 ?4 以下是一些常用的API?5 應用場景 ?1 String 介紹 Str…

ue引擎游戲開發筆記(47)——設置狀態機解決跳躍問題

1.問題分析&#xff1a; 目前當角色起跳時&#xff0c;只是簡單的上下移動&#xff0c;空中仍然保持行走動作&#xff0c;并沒有設置跳躍動作&#xff0c;因此&#xff0c;給角色設置新的跳躍動作&#xff0c;并優化新的動作動畫。 2.操作實現&#xff1a; 1.實現跳躍不復雜&…

LabVIEW常用的電機控制算法有哪些?

LabVIEW常用的電機控制算法主要包括以下幾種&#xff1a; 1. PID控制&#xff08;比例-積分-微分控制&#xff09; 描述&#xff1a;PID控制是一種經典的控制算法&#xff0c;通過調節比例、積分和微分三個參數來控制電機速度和位置。應用&#xff1a;廣泛應用于直流電機、步…

Java中的繼承和多態

繼承 在現實世界中&#xff0c;狗和貓都是動物&#xff0c;這是因為他們都有動物的一些共有的特征。 在Java中&#xff0c;可以通過繼承的方式來讓對象擁有相同的屬性&#xff0c;并且可以簡化很多代碼 例如&#xff1a;動物都有的特征&#xff0c;有名字&#xff0c;有年齡…

Mybatis源碼剖析---第一講

Mybatis源碼剖析 基礎環境搭建 JDK8 Maven3.6.3&#xff08;別的版本也可以…&#xff09; MySQL 8.0.28 --> MySQL 8 Mybatis 3.4.6 準備jar&#xff0c;準備數據庫數據 把依賴導入pom.xml中 <properties><project.build.sourceEncoding>UTF-8</p…

Linux學習筆記:線程

Linux中的線程 什么是線程線程的使用原生線程庫創建線程線程的id線程退出等待線程join分離線程取消一個線程線程的局部存儲在c程序中使用線程使用c自己封裝一個簡易的線程庫 線程互斥(多線程)導致共享數據出錯的原因互斥鎖關鍵函數pthread_mutex_t :創建一個鎖pthread_mutex_in…

雷電預警監控系統:守護安全的重要防線

TH-LD1在自然界中&#xff0c;雷電是一種常見而強大的自然現象。它既有震撼人心的壯觀景象&#xff0c;又潛藏著巨大的安全風險。為了有效應對雷電帶來的威脅&#xff0c;雷電預警監控系統應運而生&#xff0c;成為現代社會中不可或缺的安全防護工具。 雷電預警監控系統的基本…

makefile 編寫規則

1.概念 1.1 什么是makefile Makefile 是一種文本文件&#xff0c;用于描述軟件項目的構建規則和依賴關系&#xff0c;通常用于自動化軟件構建過程。它包含了一系列規則和指令&#xff0c;告訴構建系統如何編譯和鏈接源代碼文件以生成最終的可執行文件、庫文件或者其他目標文件…