【算法訓練營Day11】二叉樹part1

文章目錄

  • 理論基礎
  • 二叉樹的遞歸遍歷
    • 前序遍歷
    • 中序遍歷
    • 后序遍歷
    • 總結
  • 二叉樹的層序遍歷
    • 基礎層序遍歷
    • 二叉樹的右視圖

理論基礎

二叉樹在結構上的兩個常用類型:

  • 滿二叉樹
  • 完全二叉樹

在功能應用上的比較常用的有:

  • 二叉搜索樹: 節點有權值、遵循”左小右大“
  • 平衡二叉搜索樹(AVL樹): 在二叉樹的基礎上增添了一個特性,左右子樹高度差不超過1

二叉樹的存儲方式

  • 順序存儲:使用數組,在內存中連續分布在這里插入圖片描述

  • 鏈式存儲:使用指針,在內存中離散分布在這里插入圖片描述

二叉樹的遍歷方式

  • 深度優先遍歷(可借助棧)
    • 前序遍歷(遞歸法,迭代法)
    • 中序遍歷(遞歸法,迭代法)
    • 后序遍歷(遞歸法,迭代法)
  • 廣度優先遍歷(可借助隊列)
    • 層序遍歷(迭代法)

二叉樹的定義

public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

二叉樹的遞歸遍歷

前序遍歷

題目鏈接:144. 二叉樹的前序遍歷

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preRead(root,result);return result;}public void preRead(TreeNode node,List<Integer> list){if(node == null) return;list.add(node.val);preRead(node.left,list);preRead(node.right,list);}
}

中序遍歷

題目鏈接:94. 二叉樹的中序遍歷

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();inRead(root,result);return result;}public void inRead(TreeNode node,List<Integer> list){if(node == null) return;inRead(node.left,list);list.add(node.val);inRead(node.right,list);}
}

后序遍歷

題目鏈接:145. 二叉樹的后序遍歷

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();postRead(root,result);return result;}public void postRead(TreeNode node,List<Integer> list){if(node == null) return;postRead(node.left,list);postRead(node.right,list);list.add(node.val);}
}

總結

遞歸算法的三要素

  • 確定遞歸函數的參數和返回值: 確定哪些參數是遞歸的過程中需要處理的,那么就在遞歸函數里加上這個參數, 并且還要明確每次遞歸的返回值是什么進而確定遞歸函數的返回類型。

    • 通過”參數傳遞“自頂向下傳遞信息
    • 通過”函數返回值“自底向上傳遞信息
    • 使用全局變量,在各級函數間共享信息
  • 確定終止條件: 寫完了遞歸算法, 運行的時候,經常會遇到棧溢出的錯誤,就是沒寫終止條件或者終止條件寫的不對,操作系統也是用一個棧的結構來保存每一層遞歸的信息,如果遞歸沒有終止,操作系統的內存棧必然就會溢出。

  • 確定單層遞歸的邏輯: 確定每一層遞歸需要處理的信息。在這里也就會重復調用自己來實現遞歸的過程。

二叉樹的層序遍歷

基礎層序遍歷

題目鏈接:102. 二叉樹的層序遍歷

層序遍歷的邏輯:

  • 初始化一個隊列
  • 首先將根節點放入隊列中
  • 接下來循環往復如下操作
    • 彈出隊頭元素
    • 將彈出元素的左右節點入隊

這個題的要求在層序遍歷的基礎上增加了分層的邏輯,解題邏輯如下:

  • 在層序遍歷的基礎上
  • 我們再初始化一個隊列temp(主隊列命名為queue)
  • 我們在queue中把當前層的元素彈出時,并不立馬將其左右元素入隊queue,而是將其添加到temp隊列中
  • 當queue中所有元素彈完之后,再將temp的元素全部添加到queue中
  • 這樣就達成了queue中永遠是二叉樹中每層的所有元素

解題邏輯:

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return new ArrayList<List<Integer>>();queue.add(root);while(!queue.isEmpty()) {List<Integer> part = new ArrayList<>();Deque<TreeNode> temp = new ArrayDeque<>();while (!queue.isEmpty()) {TreeNode node = queue.poll();part.add(node.val);if(node.left != null) temp.add(node.left);if(node.right != null) temp.add(node.right);}result.add(part);while(!temp.isEmpty()) queue.add(temp.poll());}return result;}
}

這個地方可以進一步改進:

  • 無需使用新的隊列來臨時存儲一層的元素
  • 而是可以直接用一個變量界定一層的元素個數
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new LinkedList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return new ArrayList<List<Integer>>();queue.add(root);while(!queue.isEmpty()) {List<Integer> part = new LinkedList<>();int count = queue.size();while (count > 0) {TreeNode node = queue.poll();part.add(node.val);if(node.left != null) queue.add(node.left);if(node.right != null) queue.add(node.right);count--;}result.add(part);}return result;}
}

二叉樹的右視圖

題目鏈接:199. 二叉樹的右視圖

解題邏輯:

  • 在前一題的基礎上只將每一層的最后一個元素添加到結果集中就可以
  • 我們通過控制每層的長度變量,當變量為1的時候才添加到結果集中
class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> result = new LinkedList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return new ArrayList<Integer>();queue.add(root);while(!queue.isEmpty()) {int count = queue.size();while (count > 0) {TreeNode node = queue.poll();if(count == 1) result.add(node.val);if(node.left != null) queue.add(node.left);if(node.right != null) queue.add(node.right);count--;}}return result;}
}

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

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

相關文章

Flutter 之 table_calendar 控件

1.庫導入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代碼編寫TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 數組異或操作

數組異或操作題目題解題目 1486. 數組異或操作 給你兩個整數&#xff0c;n 和 start 。 數組 nums 定義為&#xff1a;nums[i] start 2*i&#xff08;下標從 0 開始&#xff09;且 n nums.length 。 請返回 nums 中所有元素按位異或&#xff08;XOR&#xff09;后得到的…

php7.4使用 new DateTime;報錯 Class DateTime not found

php7.4使用 new DateTime;報錯Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天資料&#xff0c;最后找到了解決辦法 DateTime 是 php 內置的類&#xff0c;不隸屬于任何命名空間&#xff0c;如果你需要在命名空間中使用須有 \ 聲明&#xff0c;解決辦法就是…

Gartner《構建可擴展數據產品建設框架》心得

一、背景與價值 1.1 “數據產品”為什么忽然重要? 傳統模式:業務提出需求 → IT 建數據集 → ETL 管道爆炸 → 維護成本指數級上升。 新范式:把“數據”包裝成“產品”,以產品思維迭代演進,強調復用、自助、可擴展。 Gartner 觀察到:大量組織把“報表”或“數據倉庫”重…

CentOS/RHEL LVM 磁盤擴展完整教程

CentOS/RHEL LVM 磁盤擴展完整教程&#x1f4dd; 前言 在Linux系統管理中&#xff0c;磁盤空間不足是經常遇到的問題。特別是在生產環境中&#xff0c;當根分區空間告急時&#xff0c;我們需要通過添加新磁盤來擴展存儲空間。本教程將詳細介紹如何在CentOS/RHEL系統中使用LVM&a…

LVGL應用和部署(用lua做測試)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】嵌入式產品做好了&#xff0c;下面就是測試和量產了。以按鍵屏幕的開發模式為例&#xff0c;如果僅僅是簡單的功能測試&#xff0c;那還比較好解決&…

phpstudy搭建pikachu

一.啟動mysql和nginx服務二.修改靶場文件參數點擊管理打開根目錄&#xff0c;將下載好的靶場源文件解壓到www目錄下三.找到此文件用記事本打開四.修改配置文件五.打開瀏覽器,輸入127.0.0.1/pikachu六.按照步驟初始化心得體會&#xff1a;如果mysql啟動又立刻停止&#xff0c;大…

【Linux】GDB/CGDB 調試器學習筆記

GDB/CGDB 調試器學習筆記&#x1f680; 前言 GDB 是 GNU 項目下功能強大的命令行調試器&#xff0c;適用于 C/C 等多種語言。CGDB 則是在 GDB 之上構建的輕量級 curses 界面&#xff0c;適合喜歡終端操作且習慣 vi 風格的人。一、GDB 入門篇 1. 編譯時帶調試信息 gcc -g -O0 -W…

鏈接代理后無法訪問網絡

路由方向的問題 cmd 輸入 route print 查看路由多了一個不是你網絡的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 參考這個 固定ip if是代理鏈路的 鏈路口又敏感詞這個文章不合規兩次評論區問我

day37 早停策略和模型權重的保存

DAY 37 我今天的筆記是用cpu訓練的&#xff0c;請自行修改為gpu訓練 仍然是循序漸進&#xff0c;先復習之前的代碼 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

網絡爬蟲分類全解析

網絡爬蟲作為數據獲取的重要工具,其分類方式多樣,不同類型的爬蟲在技術實現、應用場景和功能特性上存在顯著差異。深入理解這些分類,有助于開發者根據實際需求選擇合適的爬蟲方案。本文將從技術特性、應用場景和架構設計三個維度,系統介紹網絡爬蟲的主要分類。 一、按技術…

ECR倉庫CloudFormation模板完整指南

概述 本文檔詳細介紹了一個通用的Amazon ECR(Elastic Container Registry)倉庫CloudFormation模板,該模板支持多業務組、參數化配置,并包含完整的安全策略、生命周期管理和監控功能。 模板特性 核心功能 ? 支持4個業務組:app、ai、mall、frontend? 靈活的服務名手動輸…

C++(STL源碼刨析/List)

一 List 核心字段和接口1. 節點字段template<class T> struct __list_node {typedef void* void_pointer;void_pointer prev;void_pointer next;T data; }由于 鏈表 不是連續的內存塊&#xff0c;所以對每一個申請到的內存塊要進行統一組織&#xff0c;也就是封裝成一個類…

蘋果App上架流程:不用Mac也可以上架的方法

iOS App 的上架流程一直被認為是門檻最高、流程最繁瑣的移動端工作之一。對很多使用 Windows 或 Linux 進行開發的跨平臺團隊來說&#xff0c;Mac 的缺位更放大了每一步的難度。 在我們近期為一款本地生活類 App 進行 iOS 上架時&#xff0c;團隊成員幾乎沒有配備本地 Mac&…

【爬蟲】- 爬蟲原理及其入門

爬蟲01 - 爬蟲原理及其入門 文章目錄爬蟲01 - 爬蟲原理及其入門一&#xff1a;爬蟲原理1&#xff1a;爬蟲的優勢?2&#xff1a;爬蟲的核心庫3&#xff1a;經典舉例4&#xff1a;合規問題一&#xff1a;爬蟲原理 學習爬蟲之前前置知識需要了解這些&#xff1a; 我的HTTP介紹, 了…

G5打卡——Pix2Pix算法

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 Pix2Pix 是一種基于條件生成對抗網絡&#xff08;cGANs&#xff09;的圖像到圖像翻譯算法&#xff0c;由 Phillip Isola 等人在 2016 年提出。該算法的核心思想…

動力系統模擬與推導-AI云計算數值分析和代碼驗證

當系統是連續的&#xff0c;并且其狀態變量不僅隨時間變化&#xff0c;而且隨空間維度變化時&#xff0c;需要使用偏微分方程&#xff08;PDEs&#xff09;來推導運動方程。偏微分方程提供了描述這些空間分布屬性如何相互作用和演化的數學框架。 選擇使用常微分方程&#xff08…

P4597 序列 sequence題解

P4597 序列 sequence 給定一個數列&#xff0c;每次操作可以使任意一個數1或-1&#xff0c;求小的操作次數&#xff0c;使得數列變成不降數列. 1.對于前面比當前位的數字大的數&#xff0c;設最大數為 xxx &#xff0c;當前的數為 yyy ,則對于 xxx 到 yyy 中間的任意數&#xf…

雨污管網智慧監測系統網絡建設方案:基于SD-WAN混合架構的最佳實踐

隨著城市化的快速推進&#xff0c;雨污管網的管理與運行面臨著日益復雜的挑戰&#xff0c;例如內澇、污水溢流、非法排污等問題頻發。為了更高效地管理分布廣泛的監測點&#xff0c;保障系統運行穩定性&#xff0c;構建一套高效、低成本、易運維的網絡架構至關重要。本文將分享…

世俱杯直播數據源通過反匯編獲取到

在當今的互聯網體育賽事直播中&#xff0c;許多平臺為了保護其直播資源&#xff0c;會采用加密、混淆或動態加載等方式隱藏真實的視頻流地址&#xff08;如 .m3u8 或 .flv&#xff09;。對于普通用戶和開發者來說&#xff0c;直接通過網頁源碼或瀏覽器調試器難以快速定位這些關…