二叉樹、排序算法與結構圖

二叉樹、排序算法與數據庫

二叉樹

二叉樹的性質

  • 節點數與深度的關系:深度為 k k k的二叉樹,最多有 2 k ? 1 2^k - 1 2k?1個節點。例如,深度為 3 3 3的二叉樹,最多有 2 3 ? 1 = 7 2^3 - 1 = 7 23?1=7個節點。
  • 葉子節點與度為2節點的關系:對于任意一棵二叉樹,如果其葉子節點數為 n 0 n_0 n0?,度為 2 2 2的節點數為 n 2 n_2 n2?,則 n 0 = n 2 + 1 n_0 = n_2 + 1 n0?=n2?+1
      根節點/    \左子樹   右子樹/  \    /  \
節點 節點 節點 節點

二叉樹的存儲結構

  • 順序存儲結構:對于完全二叉樹,可以使用數組來存儲節點。將根節點存儲在數組的第一個位置,然后按照從上到下、從左到右的順序依次存儲其他節點。這樣可以通過節點的下標來快速訪問其左右子節點。例如,對于節點 i i i,其左子節點的下標為 2 i + 1 2i + 1 2i+1,右子節點的下標為 2 i + 2 2i + 2 2i+2
  • 鏈式存儲結構:通常使用鏈表來表示二叉樹的節點。每個節點包含三個部分:數據域、左指針域和右指針域。左指針域指向該節點的左子節點,右指針域指向該節點的右子節點。這種存儲結構可以方便地進行節點的插入和刪除操作。

二叉樹的遍歷方式

  • 前序遍歷:先訪問根節點,然后遞歸地遍歷左子樹,最后遞歸地遍歷右子樹。例如,對于二叉樹 A ( B ( D , E ) , C ( F ) ) A(B(D,E),C(F)) A(B(D,E),C(F))
    前序遍歷的結果為 A B D E C F ABDECF ABDECF
  • 中序遍歷:先遞歸地遍歷左子樹,然后訪問根節點,最后遞歸地遍歷右子樹。對于上述二叉樹,中序遍歷的結果為 D B E A C F DBEACF DBEACF
  • 后序遍歷:先遞歸地遍歷左子樹,然后遞歸地遍歷右子樹,最后訪問根節點。對于上述二叉樹,后序遍歷的結果為 D E B F C A DEBFCA DEBFCA
  • 層序遍歷:按照從上到下、從左到右的順序依次訪問二叉樹的每一層節點。對于上述二叉樹,層序遍歷的結果為 A B C D E F ABCDEF ABCDEF

題目 \text{題目} 題目
設二叉樹的中序序列為 B C D A BCDA BCDA,后序序列為 D C B A DCBA DCBA,則前序序列為: ( ) \textbf{(\qquad)}

解析 \text{解析} 解析
首先,根據后序可以得到根節點:A
其次,根據中序可以得到左子樹和右子樹:BCD
然后再根據后序確定左子樹的結構:根節點為:B,D在左,C在右或者D在上,C在下。
再看,中序發現C跑中間去了,所以是第二種情況

因此,答案為: A B C D ABCD ABCD

排序算法

排序算法是計算機科學中用于將一組數據按照特定順序(如升序或降序)排列的算法。

  1. 冒泡排序(Bubble Sort)
    • 基本思想:重復地走訪要排序的數列,一次比較兩個數據元素,如果順序不對則進行交換,并一直重復這樣的走訪操作,直到沒有要交換的數據元素為止。
    • 示例代碼(Python)
def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arr
  • 時間復雜度:平均和最壞情況下為 O ( n 2 ) O(n^2) O(n2),最好情況(數組已經有序)下為 O ( n ) O(n) O(n)
  • 空間復雜度 O ( 1 ) O(1) O(1),因為只需要幾個額外的變量來進行交換操作,不隨數據規模增長。
  • 穩定性:穩定,相同元素的相對順序在排序前后不會改變。
  1. 選擇排序(Selection Sort)
    • 基本思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
    • 示例代碼(Python)
def selection_sort(arr):n = len(arr)for i in range(n):min_index = ifor j in range(i + 1, n):if arr[j] < arr[min_index]:min_index = jarr[i], arr[min_index] = arr[min_index], arr[i]return arr
  • 時間復雜度:平均和最壞情況下為 O ( n 2 ) O(n^2) O(n2),最好情況也是 O ( n 2 ) O(n^2) O(n2),因為每次都要遍歷剩余未排序元素找最小(大)值。
  • 空間復雜度 O ( 1 ) O(1) O(1)
  • 穩定性:不穩定,例如序列 [5, 5, 3],在排序過程中,兩個 5 的相對順序可能會改變。
  1. 插入排序(Insertion Sort)
    • 基本思想:將一個數據插入到已經排好序的數組中的適當位置,從而得到一個新的、個數加一的有序數組。初始時把第一個元素看作已排序序列,然后依次將后面的元素插入到合適位置。
    • 示例代碼(Python)
def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]j = j - 1arr[j + 1] = keyreturn arr
  • 時間復雜度:平均和最壞情況下為 O ( n 2 ) O(n^2) O(n2),最好情況(數組已經有序)下為 O ( n ) O(n) O(n)
  • 空間復雜度 O ( 1 ) O(1) O(1)
  • 穩定性:穩定,在插入過程中,相同元素的相對順序不會改變。
  1. 快速排序(Quick Sort)
    • 基本思想:通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
    • 示例代碼(Python)
def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)
  • 時間復雜度:平均情況下為 O ( n log ? n ) O(n \log n) O(nlogn),最壞情況(如數組已經有序且每次選擇的基準值都不合適)下為 O ( n 2 ) O(n^2) O(n2)
  • 空間復雜度:平均情況下為 O ( log ? n ) O(\log n) O(logn),最壞情況(遞歸深度達到 n n n 層)下為 O ( n ) O(n) O(n)
  • 穩定性:不穩定,因為在劃分過程中,相同元素的相對順序可能會改變。
  1. 歸并排序(Merge Sort)
    • 基本思想:采用分治法,將一個序列分成兩個長度相等的子序列,分別對這兩個子序列進行排序,然后將排好序的子序列合并成一個最終的有序序列。
    • 示例代碼(Python)
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left_half = merge_sort(arr[:mid])right_half = merge_sort(arr[mid:])return merge(left_half, right_half)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result
  • 時間復雜度:平均、最壞和最好情況下均為 O ( n log ? n ) O(n \log n) O(nlogn),因為每次都是將序列分成兩部分,共分 log ? n \log n logn 層,每層合并操作的時間復雜度為 O ( n ) O(n) O(n)
  • 空間復雜度 O ( n ) O(n) O(n),因為在合并過程中需要額外的空間來存儲臨時序列。
  • 穩定性:穩定,在合并過程中,相同元素的相對順序不會改變。
  1. 堆排序(Heap Sort)
    • 基本思想:利用堆這種數據結構所設計的一種排序算法。堆是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子節點的鍵值或索引總是小于(或者大于)它的父節點。先將待排序序列構建成一個大頂堆(或小頂堆),此時,整個序列的最大值(或最小值)就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值(或最小值)。然后將剩余 n ? 1 n - 1 n?1 個元素重新構造成一個堆,這樣會得到 n n n個元素的次大值(或次小值)。如此反復執行,便能得到一個有序序列。
    • 示例代碼(Python)
def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[i] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heap_sort(arr):n = len(arr)for i in range(n // 2 - 1, -1, -1):heapify(arr, n, i)for i in range(n - 1, 0, -1):arr[i], arr[0] = arr[0], arr[i]heapify(arr, i, 0)return arr
  • 時間復雜度:平均和最壞情況下為 O ( n log ? n ) O(n \log n) O(nlogn),因為構建堆的時間復雜度為 O ( n ) O(n) O(n),調整堆的時間復雜度為 O ( log ? n ) O(\log n) O(logn),共進行 n ? 1 n - 1 n?1 次調整。
  • 空間復雜度 O ( 1 ) O(1) O(1),只需要一些常數級別的額外空間。
  • 穩定性:不穩定,在調整堆的過程中,相同元素的相對順序可能會改變。
排序算法平均時間復雜度最壞時間復雜度最好時間復雜度空間復雜度穩定性基本思想
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)穩定重復走訪數列,比較相鄰元素,若順序不對則交換,直到沒有元素需要交換
選擇排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不穩定從未排序序列中找最小(大)元素,放到已排序序列末尾,重復此過程
插入排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)穩定將數據插入到已排序數組的合適位置,初始把第一個元素看作已排序序列
快速排序 O ( n log ? n ) O(n \log n) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( n log ? n ) O(n \log n) O(nlogn)平均 O ( log ? n ) O(\log n) O(logn),最壞 O ( n ) O(n) O(n)不穩定選擇基準值,將序列分成兩部分,分別對兩部分遞歸排序
歸并排序 O ( n log ? n ) O(n \log n) O(nlogn) O ( n log ? n ) O(n \log n) O(nlogn) O ( n log ? n ) O(n \log n) O(nlogn) O ( n ) O(n) O(n)穩定采用分治法,將序列分成子序列排序后合并成最終有序序列
堆排序 O ( n log ? n ) O(n \log n) O(nlogn) O ( n log ? n ) O(n \log n) O(nlogn) O ( n log ? n ) O(n \log n) O(nlogn) O ( 1 ) O(1) O(1)不穩定先構建堆,將堆頂元素與末尾元素交換,調整堆,重復此過程

以下是幾種常見排序算法對長度為(n)的數組排序最多需要的步驟公式:

排序算法最多步驟公式
冒泡排序 n ( n ? 1 ) 2 \frac{n(n - 1)}{2} 2n(n?1)?
選擇排序 n ( n ? 1 ) 2 + n ? 1 \frac{n(n - 1)}{2}+n - 1 2n(n?1)?+n?1
插入排序 n ( n ? 1 ) n(n - 1) n(n?1)
快速排序 n ( n ? 1 ) ÷ 2 n(n - 1)\div2 n(n?1)÷2(最壞情況)
歸并排序 n log ? 2 n n\log_2n nlog2?n
堆排序 n log ? 2 n + n n\log_2n + n nlog2?n+n

以下幾個結論:

  • 最壞情況下希爾排序和堆排序的時間復雜度與其它的不同。
  • 最壞情況下:有序表的對分查找<循環鏈表最大項<順序查找<堆排序

結構圖

結構圖是描述系統、組織或結構層次關系的可視化工具,其深度和相關概念在不同領域(如計算機科學、管理學、系統工程等)有不同的定義和應用。以下是關于結構圖深度及其相關概念的詳細說明:

一、結構圖的深度(Depth)

定義
結構圖的深度指從最高層(根節點)到最低層(葉子節點)的層級數量。它反映了系統或組織的縱向復雜度

示例

  • 在公司組織結構圖中,若層級為“董事會→CEO→部門經理→團隊主管→員工”,則深度為5層。
  • 在軟件架構中,若類繼承層次為“基類→子類A→子類B→子類C”,則深度為4層。

意義

  • 深度過深(如多層嵌套)可能導致:
    • 信息傳遞效率降低(如決策延遲)。
    • 維護成本增加(如代碼修改需逐層調整)。
  • 深度過淺(如扁平化結構)可能導致:
    • 管理寬度過大(如一個管理者直接領導過多下屬)。
    • 功能劃分不清晰(如模塊職責不明確)。

二、相關概念

1. 寬度(Width)
  • 定義:某一層級中節點的橫向數量(如同一層級的子模塊或部門數量)。
  • 示例:部門經理下有5個團隊主管,寬度為5。
  • 意義:寬度過大會增加管理難度(需平衡管理跨度)。
2. 復雜度(Complexity)
  • 定義:結構中節點間連接關系的數量和類型(如依賴、繼承、調用關系)。
  • 示例:模塊間頻繁調用或循環依賴會增加復雜度。
  • 意義:高復雜度可能導致系統難以理解、擴展或維護。
3. 模塊化(Modularity)
  • 定義:將系統分解為獨立、可替換的模塊,每個模塊完成特定功能。
  • 示例:軟件中的“用戶模塊”“支付模塊”。
  • 意義:提高復用性、降低耦合度(模塊間低依賴)。
4. 耦合(Coupling)與內聚(Cohesion)
  • 耦合:模塊間的依賴程度(低耦合更優)。
  • 內聚:模塊內部功能的相關性(高內聚更優)。
  • 示例:若模塊A直接修改模塊B的數據,耦合度高;若模塊僅處理自身業務邏輯,內聚度高。
5. 扇入(Fan-In)與扇出(Fan-Out)
  • 扇入:某模塊被其他模塊調用的次數。
  • 扇出:某模塊調用其他模塊的次數。
  • 意義:高扇入說明模塊復用性強;高扇出可能增加維護難度。

三、應用場景

  1. 軟件架構設計
    • 控制繼承層次深度(避免“類爆炸”)。
    • 優化模塊間依賴關系(降低耦合)。
  2. 組織管理
    • 設計層級結構(如扁平化或科層制)。
    • 平衡管理寬度(如管理跨度理論)。
  3. 系統工程
    • 分解復雜系統為子系統(如航空航天系統)。
    • 確保各層級職責清晰(如硬件層、驅動層、應用層)。

四、設計原則

  • 適度深度:根據領域需求平衡層級(如管理類系統通常較扁平,技術類系統可能更復雜)。
  • 高內聚、低耦合:模塊獨立且功能集中。
  • 單一職責原則:每個模塊/層級只負責一類功能。
  • 開閉原則:允許擴展(增加層級)而不修改現有結構。

隊列

  • front=rear:隊列要么空要么滿

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

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

相關文章

vmwaretools解壓失敗|vmware tools distrib cannot mkdir read only file system|bug匯總

最簡單的一條路線&#xff1a;你的解壓命令用sudo了嗎&#xff1f; 這個方法不能解決的話就看下面內容。本文提供給你全過程思路。 如需轉載&#xff0c;標記出處 背景&#xff1a; 之前虛擬機和主機的復制黏貼還能用&#xff0c;今天突然用不了&#xff0c;重新下載安裝包&am…

jEasyUI 創建自定義視圖

jEasyUI 創建自定義視圖 引言 jEasyUI 是一款流行的 jQuery UI 組件庫&#xff0c;它提供了豐富的 UI 組件和交互效果&#xff0c;極大地簡化了 Web 開發的復雜度。在 jEasyUI 中&#xff0c;我們可以通過自定義視圖來擴展其功能&#xff0c;滿足特定的業務需求。本文將詳細介…

Spring MVC配置詳解:從歷史到實戰

文章目錄 一、Java Web的發展歷程1.Model I與Model II開發模式&#xff08;1&#xff09; Model I開發模式&#xff08;2&#xff09;Model II開發模式 2.MVC設計模式Spring MVC本質MVC工作流程 二、Spring MVC快速入門實戰1.環境搭建步驟&#xff08;1&#xff09;創建Maven W…

老是忘記package.json,備忘一下 webpack 環境下 Vue Cli 和 Vite 命令行工具對比

Vue 2.X webpack 環境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…

【樹莓派Pico FreeRTOS】-Mutex(互斥體)

Mutex(互斥體) 文章目錄 Mutex(互斥體)1、硬件準備2、軟件準備3、FreeRTOS的Mutex介紹4、完整示例RP2040 由 Raspberry Pi 設計,具有雙核 Arm Cortex-M0+ 處理器和 264KB 內部 RAM,并支持高達 16MB 的片外閃存。 廣泛的靈活 I/O 選項包括 I2C、SPI 和獨特的可編程 I/O (P…

sock文件介紹--以mysql.sock為例

socket 文件 (.sock) 通常是臨時文件。 MySQL 的 socket 文件是臨時文件&#xff0c;只在服務運行時有效。可通過配置文件更改 socket 文件的存放路徑&#xff0c;常見路徑如 /tmp/mysql.sock 或指定自定義目錄。如果連接出現問題&#xff0c;可能需要檢查 MySQL 服務狀態或路…

Docker應用部署之mysql篇(day5)

文章目錄 前言一、問題描述二、解決方案1. 搜索 MySQL 鏡像2. 拉取 MySQL 鏡像3. 創建并運行 MySQL 容器參數說明&#xff1a; 4. 驗證容器是否運行5. 進入 MySQL 容器 三、總結 前言 在日常開發和部署中&#xff0c;MySQL 是最常用的關系型數據庫之一。借助 Docker&#xff0…

【Elasticsearch基礎】基本核心概念介紹

Elasticsearch作為當前最流行的分布式搜索和分析引擎&#xff0c;其強大的功能背后是一套精心設計的核心概念體系。本文將深入解析Elasticsearch的五大核心概念&#xff0c;幫助開發者構建堅實的技術基礎&#xff0c;并為高效使用ES提供理論支撐。 1 索引&#xff08;Index&…

Qt在ARM中,如何使用drmModeObjectSetProperty 設置 Plane 的 zpos 值

在 Qt 中直接使用 drmModeObjectSetProperty 設置 Plane 的 zpos 值需要結合 Linux DRM/KMS API 和 Qt 的底層窗口系統&#xff08;如 eglfs 平臺插件&#xff09;。以下是詳細步驟和代碼示例&#xff1a; 1. 原理說明 DRM/KMS 基礎&#xff1a; Plane&#xff1a;負責圖層合成…

MFC添加免費版大漠3.1233

先創建一個MFC工程&#xff0c; 添加dm.dll 方法一&#xff1a;通過類向導-添加類-類型庫中的MFC類-文件&#xff0c;選擇dm.dll&#xff0c;如果沒有"添加類型庫中的MFC類"選項就用方法二添加 方法二&#xff1a;添加-新建項-MFC-Active或TypeLib-實現接口位置選…

【Linux】應用層協議 HTTP

應用層協議 HTTP 一. HTTP 協議1. URL 地址2. urlencode 和 urldecode3. 請求與響應格式 二. HTTP 請求方法1. GET 和 POST (重點) 三. HTTP 狀態碼四. HTTP 常見報頭五. 手寫 HTTP 服務器 HTTP&#xff08;超文本傳輸協議&#xff09;是一種應用層協議&#xff0c;用于在萬維網…

【活動回顧】StarRocks Singapore Meetup #2 @Shopee

3 月 13 日&#xff0c;StarRocks 社區在新加坡成功舉辦了第二場 Meetup 活動&#xff0c;主題為“Empowering Customer-Facing Analytics”。本次活動在 Shopee 新加坡辦公室舉行&#xff0c;吸引了來自 Shopee、Grab 和 Pinterest 的專家講師以及 50 多位參會者。大家圍繞電商…

Retinexformer:基于 Retinex 的單階段 Transformer 低光照圖像增強方法

開頭發點牢騷&#xff1a;本來做的好好都都要中期了&#xff0c;導師怎么突然給我換題目啊。真是繃不住了......又要從頭開始學了&#xff0c;唉&#xff01; 原論文鏈接&#xff1a;Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement 低光…

后端——AOP異步日志

需求分析 在SpringBoot系統中&#xff0c;一般會對訪問系統的請求做日志記錄的需求&#xff0c;確保系統的安全維護以及查看接口的調用情況&#xff0c;可以使用AOP對controller層的接口進行增強&#xff0c;作日志記錄。日志保存在數據庫當中&#xff0c;為了避免影響接口的響…

flink廣播算子Broadcast

文章目錄 一、Broadcast二、代碼示例三.或者第二種(只讀取一個csv文件到廣播內存中)提示:以下是本篇文章正文內容,下面案例可供參考 一、Broadcast 為了關聯一個非廣播流(keyed 或者 non-keyed)與一個廣播流(BroadcastStream),我們可以調用非廣播流的方法 connect(),…

Redis 和 MySQL雙寫一致性的更新策略有哪些?常見面試題深度解答。

目錄 一. 業務數據查詢&#xff0c;更新順序簡要分析 二. 更新數據庫、查詢數據庫、更新緩存、查詢緩存耗時對比 2.1 更新數據庫&#xff08;最慢&#xff09; 2.2 查詢數據庫&#xff08;較慢&#xff09; 2.3 更新緩存&#xff08;次快&#xff09; 2.4 查詢緩存&#…

SRT協議

SRT&#xff08;Secure Reliable Transport&#xff09;是一種開源的視頻傳輸協議&#xff0c;專為高丟包、高延遲網絡環境設計&#xff0c;結合了UDP的低延遲和TCP的可靠性&#xff0c;廣泛應用于直播、遠程制作、視頻會議等場景。 定位&#xff1a;SRT協議的官方C/C實現庫&am…

“征服HTML引號惡魔:“完全解析手冊”!!!(quot;表示雙引號)

&#x1f6a8;&#x1f4e2; "征服HTML引號惡魔&#xff1a;“完全解析手冊” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;當引號變成"惡魔" &#x1f631; 是否遇到過這種情況&#xff1a; 寫HTML時滿心歡喜輸入<div title"他…

npm install 卡在創建項目:sill idealTree buildDeps

參考&#xff1a; https://blog.csdn.net/PengXing_Huang/article/details/136460133 或者再執行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 或者換梯子

c++中cpp文件從編譯到執行的過程

C 文件從編寫到執行的過程可以分為幾個主要階段&#xff1a;編寫代碼、預處理、編譯、匯編、鏈接和運行。以下是每個階段的詳細說明&#xff1a; 1. 編寫代碼 這是整個過程的起點。程序員使用文本編輯器&#xff08;如 VSCode、Sublime Text 或其他 IDE&#xff09;編寫 C 源…