java-代碼隨想錄第十四天| 二叉樹層序遍歷相關題目

目錄

102.二叉樹的層序遍歷

107.二叉樹的層次遍歷II

199.二叉樹的右視圖

637.二叉樹的層平均值

429.N叉樹的層序遍歷

515.在每個樹行中找最大值

116.填充每個節點的下一個右側節點指針

117.填充每個節點的下一個右側節點指針II

104.二叉樹的最大深度

111.二叉樹的最小深度


參考:代碼隨想錄

102.二叉樹的層序遍歷

鏈接:102. 二叉樹的層序遍歷 - 力扣(LeetCode)

題目:給你二叉樹的根節點?root?,返回其節點值的?層序遍歷?。 (即逐層地,從左到右訪問所有節點)。

題解:隊列驅動+逐層收集節點值

?在二叉樹遍歷中,"迭代法"指的是使用循環結構(如 while/for)和顯式的數據結構(如隊列)?來實現遍歷,而不是通過函數遞歸調用(遞歸法)

工作流程

1.在每層開始時:記錄隊列當前長度len

????????這個值就是當前層所有節點的數量,此時隊列中的節點全部屬于同一層

2.處理當前層:執行len次循環

????????每次循環處理一個節點節點出隊時,將其子節點加入隊列 (這些子節點屬于下一層)

3.自然切換層級:當1en減到0時

????????當前層所有節點處理完畢,隊列中剩下的全是新加入的子節點(即下一層節點),自動切換到下一層的處理

class Solution {public List<List<Integer>> resList = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {checkFun02(root);return resList;}public void checkFun02(TreeNode node) {if (node == null) return;//頭出尾入的雙端隊列Queue<TreeNode> que = new LinkedList<TreeNode>();//根節點入隊que.offer(node);//外層循環:處理每一層while (!que.isEmpty()) {//存儲當前層所有節點值List<Integer> itemList = new ArrayList<Integer>();//當前層節點的數量int len = que.size();//內層循環:處理當前層所有的節點while (len > 0) {//1.隊頭出隊TreeNode tmpNode = que.poll();//2.記錄節點值itemList.add(tmpNode.val);//3.子節點入隊(先左后右)if (tmpNode.left != null) que.offer(tmpNode.left);if (tmpNode.right != null) que.offer(tmpNode.right);//當前層節點計數器減去1len--;}//整層節點值存入結果resList.add(itemList);}
}

107.二叉樹的層次遍歷II

鏈接:107. 二叉樹的層序遍歷 II - 力扣(LeetCode)

題目:給你二叉樹的根節點?root?,返回其節點值?自底向上的層序遍歷?。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)

題解:

public class N0107 {/*** 解法:隊列,迭代。* 層序遍歷,再翻轉數組即可。*/public List<List<Integer>> solution1(TreeNode root) {List<List<Integer>> list = new ArrayList<>();Deque<TreeNode> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {List<Integer> levelList = new ArrayList<>();int levelSize = que.size();for (int i = 0; i < levelSize; i++) {TreeNode peek = que.peekFirst();levelList.add(que.pollFirst().val);if (peek.left != null) {que.offerLast(peek.left);}if (peek.right != null) {que.offerLast(peek.right);}}list.add(levelList);}List<List<Integer>> result = new ArrayList<>();for (int i = list.size() - 1; i >= 0; i-- ) {result.add(list.get(i));}return result;}
}

199.二叉樹的右視圖

鏈接:199. 二叉樹的右視圖 - 力扣(LeetCode)

題目:給定一個二叉樹的?根節點?root,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

題解:層序遍歷的時候,判斷是否遍歷到單層的最后面的元素,如果是,放入result數組種,隨后返回result.

public class N0199 {/*** 解法:隊列,迭代。* 每次返回每層的最后一個字段即可。** 小優化:每層右孩子先入隊。代碼略。*/public List<Integer> rightSideView(TreeNode root) {List<Integer> list = new ArrayList<>();Deque<TreeNode> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {int levelSize = que.size();for (int i = 0; i < levelSize; i++) {TreeNode poll = que.pollFirst();if (poll.left != null) {que.addLast(poll.left);}if (poll.right != null) {que.addLast(poll.right);}if (i == levelSize - 1) {list.add(poll.val);}}}return list;}
}

637.二叉樹的層平均值

鏈接:637. 二叉樹的層平均值 - 力扣(LeetCode)

題目:給定一個非空二叉樹的根節點?root?, 以數組的形式返回每一層節點的平均值。與實際答案相差?10-5?以內的答案可以被接受。

題解:層序遍歷的時候把一層求個總和再取個均值。

public class N0637 {/*** 解法:隊列,迭代。* 每次返回每層的最后一個字段即可。*/public List<Double> averageOfLevels(TreeNode root) {List<Double> list = new ArrayList<>();Deque<TreeNode> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {int levelSize = que.size();double levelSum = 0.0;for (int i = 0; i < levelSize; i++) {TreeNode poll = que.pollFirst();levelSum += poll.val;if (poll.left != null) {que.addLast(poll.left);}if (poll.right != null) {que.addLast(poll.right);}}list.add(levelSum / levelSize);}return list;}
}

429.N叉樹的層序遍歷

鏈接:429. N 叉樹的層序遍歷 - 力扣(LeetCode)

題目:

????????給定一個 N 叉樹,返回其節點值的層序遍歷。(即從左到右,逐層遍歷)。

樹的序列化輸入是用層序遍歷,每組子節點都由 null 值分隔(參見示例)。

題解:一個節點有多個孩子

public class N0429 {/*** 解法1:隊列,迭代。*/public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> list = new ArrayList<>();Deque<Node> que = new LinkedList<>();if (root == null) {return list;}que.offerLast(root);while (!que.isEmpty()) {int levelSize = que.size();List<Integer> levelList = new ArrayList<>();for (int i = 0; i < levelSize; i++) {Node poll = que.pollFirst();levelList.add(poll.val);List<Node> children = poll.children;if (children == null || children.size() == 0) {continue;}for (Node child : children) {if (child != null) {que.offerLast(child);}}}list.add(levelList);}return list;}class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}}
}

515.在每個樹行中找最大值

鏈接:515. 在每個樹行中找最大值 - 力扣(LeetCode)

題目:給定一棵二叉樹的根節點?root?,請找出該二叉樹中每一層的最大值。

題解:層序遍歷,取每層的最大值。

class Solution {public List<Integer> largestValues(TreeNode root) {if(root == null){return Collections.emptyList();}List<Integer> result = new ArrayList();Queue<TreeNode> queue = new LinkedList();queue.offer(root);while(!queue.isEmpty()){int max = Integer.MIN_VALUE;for(int i = queue.size(); i > 0; i--){TreeNode node = queue.poll();max = Math.max(max, node.val);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);}result.add(max);}return result;}
}

116.填充每個節點的下一個右側節點指針

鏈接:116. 填充每個節點的下一個右側節點指針 - 力扣(LeetCode)

題目:

???????

給定一個?完美二叉樹?,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為?NULL

初始狀態下,所有?next 指針都被設置為?NULL

題解:依然是層序遍歷,只不過在單層遍歷的時候記錄一下本層的頭部節點,然后在遍歷的時候讓前一個節點指向本節點就可以了

class Solution {public Node connect(Node root) {Queue<Node> tmpQueue = new LinkedList<Node>();if (root != null) tmpQueue.add(root);while (tmpQueue.size() != 0){int size = tmpQueue.size();Node cur = tmpQueue.poll();if (cur.left != null) tmpQueue.add(cur.left);if (cur.right != null) tmpQueue.add(cur.right);for (int index = 1; index < size; index++){Node next = tmpQueue.poll();if (next.left != null) tmpQueue.add(next.left);if (next.right != null) tmpQueue.add(next.right);cur.next = next;cur = next;}}return root;}
}

117.填充每個節點的下一個右側節點指針II

鏈接:117. 填充每個節點的下一個右側節點指針 II - 力扣(LeetCode)

題目:

給定一個二叉樹:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為?NULL?。

初始狀態下,所有?next 指針都被設置為?NULL?。

題解:

class Solution {public Node connect(Node root) {Queue<Node> queue = new LinkedList<>();if (root != null) {queue.add(root);}while (!queue.isEmpty()) {int size = queue.size();Node node = null;Node nodePre = null;for (int i = 0; i < size; i++) {if (i == 0) {nodePre = queue.poll(); // 取出本層頭一個節點node = nodePre;} else {node = queue.poll();nodePre.next = node; // 本層前一個節點 next 指向當前節點nodePre = nodePre.next;}if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}nodePre.next = null; // 本層最后一個節點 next 指向 null}return root;}
}

104.二叉樹的最大深度

鏈接:104. 二叉樹的最大深度 - 力扣(LeetCode)

題目:

????????給定一個二叉樹?root?,返回其最大深度。

二叉樹的?最大深度?是指從根節點到最遠葉子節點的最長路徑上的節點數。

題解:二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。最大的深度就是二叉樹的層數。

class Solution {public int maxDepth(TreeNode root) {if (root == null)   return 0;Queue<TreeNode> que = new LinkedList<>();que.offer(root);int depth = 0;while (!que.isEmpty()){int len = que.size();while (len > 0){TreeNode node = que.poll();if (node.left != null)  que.offer(node.left);if (node.right != null) que.offer(node.right);len--;}depth++;}return depth;}
}

111.二叉樹的最小深度

鏈接:111. 二叉樹的最小深度 - 力扣(LeetCode)

題目:

????????給定一個二叉樹,找出其最小深度。

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。

說明:葉子節點是指沒有子節點的節點。

題解:當左右孩子都為空的時候,說明遍歷到最低點了。

class Solution {public int minDepth(TreeNode root){if (root == null) {return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while (!queue.isEmpty()){int size = queue.size();depth++;TreeNode cur = null;for (int i = 0; i < size; i++) {cur = queue.poll();//如果當前節點的左右孩子都為空,直接返回最小深度if (cur.left == null && cur.right == null){return depth;}if (cur.left != null) queue.offer(cur.left);if (cur.right != null) queue.offer(cur.right);}}return depth;}
}

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

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

相關文章

C++智能指針詳解:告別內存泄漏,擁抱安全高效

??小新課堂開課了&#xff0c;歡迎歡迎~?? &#x1f388;&#x1f388;養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; 所屬專欄&#xff1a;C&#xff1a;由淺入深篇 小新的主頁&#xff1a;編程版小新-CSDN博客 引言&#xff1a;為什么引入智能指針&#…

算法訓練營day57 圖論⑦ prim算法精講、kruskal算法精講

兩種最小生成樹算法講解 prim算法精講 卡碼網53. 尋寶 本題題目內容為最短連接&#xff0c;是最小生成樹的模板題&#xff0c;那么我們來講一講最小生成樹。最小生成樹可以使用prim算法也可以使用kruskal算法計算出來。本篇我們先講解prim算法。 最小生成樹是所有節點的最小連…

148-基于Python的2024物流年度銷售收入數據可視化分析系統

基于Python Django的物流數據可視化分析系統開發實錄 項目背景 隨著物流行業數據量的激增&#xff0c;企業對數據分析和可視化的需求日益增長。傳統的Excel分析方式難以滿足多維度、實時、交互式的數據洞察需求。為此&#xff0c;我們開發了一個基于Python Django的物流年度銷售…

Python中的關鍵字參數:靈活與可讀性的完美結合(Effective Python 第23條)

在Python編程中&#xff0c;函數參數的傳遞方式靈活多樣&#xff0c;而其中一種特別強大的方式就是關鍵字參數。關鍵字參數不僅能夠提升代碼的可讀性&#xff0c;還為函數的設計和調用提供了極大的便利。本文將深入探討關鍵字參數的用法、優勢以及實際應用中的注意事項。 一、關…

005.Redis 主從復制架構

主從復制概念與原理 核心概念 主節點&#xff08;Master&#xff09;&#xff1a;唯一接受寫操作的節點&#xff0c;數據修改后異步復制到從節點。 從節點&#xff08;Replica&#xff09;&#xff1a;復制主節點數據的節點&#xff0c;默認只讀&#xff08;可配置為可寫但不…

Android Studio 模擬器 “******“ has terminated 問題

問題&#xff1a;Android Studio 模擬器 "**" has terminated 問題設備信息&#xff1a;CPU:I5 7500U RAM:64GB System:Windows 10 64位解決&#xff1a; 網上所有辦法都嘗試后仍然不可行可嘗試如下辦法&#xff1a;1、此電腦→管理→設備管理→顯示適配器→右擊→…

uniapp 懶加載圖片

實現的功能 1.一次性獲取圖片。 2.按用戶視野范圍內看到的圖片滾動下來進行懶加載,提高瀏覽器性能。 3.不要一次性加載全部的圖片 1.給父組件綁定一個滾動監聽 1.頁面路徑:/pages/Home/index.vue 不在一個頁面的話用 EventBus去觸發。@scroll="handleScroll2" Ev…

Android - 資源類型 MINE Type

一、概念MINE&#xff08;Multipurpose Internet Mail Extensions&#xff09;最初是為了標識電子郵件附件的類型&#xff0c;在 HTML 中使用 content-type 屬性表示&#xff0c;描述了文件類型的互聯網標準。格式&#xff1a;媒體類型/子類型&#xff0c;可使用通配符*。如 au…

php8.+ 新函數總結

PHP系統函數是PHP核心提供的內置函數&#xff0c;用于執行常見任務&#xff0c;如字符串操作、數組處理、數學運算等。它們通過預定義代碼塊封裝了特定功能&#xff0c;開發者可直接調用而無需重復編寫代碼。 而 PHP 8.0以后又新增了一些實用函數&#xff0c;今天總結部分常見的…

Qt事件處理機制詳解

一、事件處理基本流程在Qt中&#xff0c;所有從QObject派生的類都能處理事件。事件處理的核心流程如下&#xff1a;事件入口函數&#xff1a;bool QObject::event(QEvent *e)參數e包含事件信息&#xff0c;通過e->type()獲取事件類型返回值true表示事件已被處理&#xff0c;…

Zynq中級開發七項必修課-第三課:S_AXI_GP0 主動訪問 PS 地址空間

Zynq中級開發七項必修課-第三課&#xff1a;S_AXI_GP0 主動訪問 PS 地址空間 目標1.0 編寫 AXI-Lite Master&#xff1a;按鍵計數 → 寫入 PS 內存1.1 PL 觸發中斷 → PS 響應并串口打印按鍵計數值BD圖axi_lite_master.v // // AXI4-Lite Simple Master (single-shot, non-pip…

CVPR | 2025 | MAP:通過掩碼自回歸預訓練釋放混合 Mamba - Transformer 視覺骨干網絡的潛力

文章目錄CVPR | 2025 | MAP&#xff1a;通過掩碼自回歸預訓練釋放混合 Mamba - Transformer 視覺骨干網絡的潛力創新點初步研究初步結論方法確定一個混合網絡方法掩碼機制掩碼比例MAP的transformer解碼器重建目標實驗ImageNet-1k 上的 2D 分類CVPR | 2025 | MAP&#xff1a;通過…

Spring Boot + Spring AI 最小可運行 Demo

一. 項目依賴&#xff08;pom.xml&#xff09;<project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/mav…

AI重塑校園教育:中小學AI智慧課堂定制方案+AI作業批改減負,告別一刀切學生進步快

家長們&#xff0c;你有沒有聽過孩子抱怨上學的煩惱&#xff1f;課堂上老師講的內容&#xff0c;有的同學覺得太簡單 “吃不飽”&#xff0c;有的卻跟不上 “聽不懂”&#xff1b;放學后作業堆成山&#xff0c;老師要熬夜批改到半夜&#xff0c;錯題反饋要等第二天才能拿到&…

舊物循環,交易新生——舊物回收二手交易小程序,引領綠色消費新風尚

在資源日益緊張、環境污染問題日益突出的今天&#xff0c;綠色消費已經成為時代發展的必然趨勢。舊物回收二手交易小程序&#xff0c;作為綠色消費的重要載體&#xff0c;正以其獨特的優勢和魅力&#xff0c;引領著一場關于舊物循環、交易新生的綠色革命。一、舊物循環&#xf…

刷機維修進階教程-----如何清除云賬號 修復wifi 指南針 相機 指紋等刷機故障

在刷機、系統升級或降級過程中,是否遇到過以下問題:WiFi無法開啟、相機無響應、指南針或陀螺儀失靈 指紋等故障?另外,云賬號是否仍會保留,即使通過9008模式刷機也無法徹底清除?那么這篇博文都可以找到答案。 通過博文了解?????? 1??????----云賬號信息分區如…

AI翻唱實戰:用[靈龍AI API]玩轉AI翻唱 – 第6篇

歷史文章 [靈龍AI API] 申請訪問令牌 - 第1篇 [靈龍AI API] AI生成視頻API&#xff1a;文生視頻 – 第2篇 圖生視頻實戰&#xff1a;用[靈龍AI API]玩轉AI生成視頻 – 第2篇&#xff0c;從靜圖到大片 單圖特效實戰&#xff1a;用[靈龍AI API]玩轉AI生成視頻 – 第3篇&#…

大模型0基礎開發入門與實踐:第11章 進階:LangChain與外部工具調用

第11章 進階&#xff1a;LangChain與外部工具調用 1. 引言 在上一章&#xff0c;我們成功地創造了我們的第一個“生命”——一個可以對話的機器人。我們為它的誕生而興奮&#xff0c;但很快我們就會發現它的局限性。它就像一個被囚禁在玻璃房中的天才大腦&#xff0c;擁有淵博…

SQL 日期處理:深入解析與高效實踐

SQL 日期處理&#xff1a;深入解析與高效實踐 引言 在數據庫管理中&#xff0c;日期和時間數據的處理是不可或缺的一部分。SQL&#xff08;結構化查詢語言&#xff09;提供了豐富的日期和時間函數&#xff0c;使得對日期的處理變得既靈活又高效。本文將深入探討SQL日期處理的相…

源代碼部署 LAMP 架構

源代碼部署 LAMP 架構 &#xff08;Linux Apache MySQL PHP&#xff09; 一、LAMP 架構概述 LAMP 是一套經典的開源 Web 服務架構&#xff0c;通過源代碼安裝可實現高度定制化&#xff0c;適用于對軟件版本、功能模塊有特定需求的場景。本指南基于 CentOS 7 系統&#xf…