數據結構---二叉樹(概念、特點、分類、特性、讀取順序、例題)、gdb調試指令、時間復雜度(概念、大O符號法、分類)

一、二叉樹

1、樹

?? 1)概念? ? ? ??

????????樹是 n(n >= 0) 個結點的有限集合。若 n=0 ,為空樹。

? ? ? ? 在任意一個非空樹中:

? ? ? ? ? (1)有且僅有一個特定的根結點;

? ? ? ? ? (2)當 n>1 時,其余結點可分為 m 個互不相交的有限集合T1、T2......Tm,其中每一個集合又是一個樹,并且稱為子樹。

? ?2)度、度數、深度

? ? ? ? 結點擁有子樹的個數稱為結點的。度為 0 的結點稱為葉結點;度不為 0 稱為分支結點。

? ? ? ? 樹的度數:指在這顆樹中,最大的結點的度數,稱為樹的度數。

? ? ? ? 樹的深度(高度):指從根開始,根為第一層,根的孩子為第二層,即樹的層數,稱為樹的深度。

? ? ? ? 樹的存儲:順序結構、鏈表結構。

2、二叉樹(binary tree)

? 1)概念

? ? ? ? 二叉樹是 n 個結點的有限集合,集合要么為空樹,要么由一個根節點和兩棵互不相交的樹組成,這兩棵樹分別稱為根節點的左子樹和右子樹。

? 2)特點

? ? ?(1)每個結點最多兩個子樹。

? ? ?(2)左子樹和右子樹是有順序的,次序不能顛倒。

? ? ?(3)如果某個結點只有一個子樹,也要區分左、右子樹。

??3)特殊的二叉樹

? ?? (1)斜樹

? ? ? ? 斜樹分為兩種,一種是所有的結點都只有左子樹,稱為左斜樹;另一種是所有的結點都只有右子樹,稱為右斜樹。

? ? ? ? (2)滿二叉樹

? ? ? ? 滿二叉樹是指所有的分支結點都存在左右子樹,并且葉子都在同一層上。

? ? ? ??(3)完全二叉樹

? ? ? ? 完全二叉樹是指:對于一顆具有 n 個結點的二叉樹按照層序編號,如果編號 i( 1<= i <= n )的結點于同樣深度的滿二叉樹中編號為 i 的結點在二叉樹中的位置完全相同,則此樹稱為完全二叉樹。

? ??4)特性

? ? ? ?(1)在二叉樹的第 i 層上最多有 2^(i-1) 個結點,i >= 1。

? ? ? ?(2)深度為 k 的二叉樹至多有 2^k-1 個結點,k >= 1。

? ? ? ?(3)任意一個二叉樹T,如果其葉子結點的個數為 N,度數為 M,則 N=M+1。

? ? ? ?(4)有 n 個結點的完全二叉樹深度為(logn / log2)+ 1。

? ?5)層序

? ? ? ? 前序:根左右。先訪問根結點,再訪問左結點,最后訪問右結點。

? ? ? ? 中序:左根右。先從根結點開始(不是先訪問根結點),從左結點開始訪問,再訪問根結點,最后訪問右結點。

? ? ? ? 后序:左右根。先從根結點開始(不是先訪問根結點),從左結點開始訪問,再訪問右結點,最后訪問根結點。

?????6)二叉樹的函數應用

? ? ? ? (1)創建二叉樹函數

void CreateTree(BiTNode **root)
{char c = data[ind++];if('#' == c){*root = NULL;return ;}else{*root = malloc(sizeof(BiTNode));if(NULL == *root){printf("malloc error\n");*root = NULL;return ;}(*root) -> data = c;CreateTree(&(*root) -> ichild);CreateTree(&(*root) -> rchild);}return ;
}

? ? ? ?( 2)根左右(前序)函數封裝

//根左右
void PreOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}else{printf("%c", root -> data);PreOrderTraverse(root -> ichild);PreOrderTraverse(root -> rchild);}return ;
}

? ? ? (? 3)左根右(中序)函數封裝

//左根右
void InOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}InOrderTraverse(root -> ichild);printf("%c", root -> data);InOrderTraverse(root -> rchild);return ;
}

? ? ? ? (4)左右根(后序)函數封裝

//左右根
void PostOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}PostOrderTraverse(root -> ichild);PostOrderTraverse(root -> rchild);printf("%c", root -> data);return ;
}

? ? ? ? (5)二叉樹銷毀函數封裝

//銷毀
void DestroyTree(BiTNode *root)
{if(NULL == root){return ;}DestroyTree(root -> ichild);DestroyTree(root -> rchild);free(root);return ;
}

? ? ? ?( 6)頭文件與其余聲明

#include <stdio.h>
#include <string.h>
#include <stdlib.h>typedef char DATATYPE;typedef struct BiTNode
{DATATYPE data;struct BiTNode *ichild, *rchild; 
}BiTNode;char data[] = "Abd#g###ce#h##fi###";
int ind = 0;

? ? ? ?( 7)主函數運行格式

int main(int argc, char **argv)
{BiTNode *root;CreateTree(&root);PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DestroyTree(root);root = NULL;return 0;
}

二、gbd調試指令

? ? ? ? gdb 調試指令用來尋找段錯誤。

1、一般調試

? ? ? 1)gcc -g 文件名

? ? ??2)gbd ./a.out (a.out 為該函數的可執行文件)

? ? ??3)b? 函數名???設置斷點,運行到這個函數位置,程序自動暫停

? ? ? ? ? ? ? b? ?數字? ? ?運行到 main函數的這一 “數字” 行,程序自動暫停

? ? ? 4)r? 運行

? ?? ?5)n? 執行下一步(行)步過,若是函數,直接調用結束

? ? ??6)p? 使用p命令,查看變量或指針等數據,p a(變量); p *a(指針)

2、其他相關命令

? ? ??1)bt? 與 where? 顯示棧結構,函數的調用關系

? ? ? 2)s? 步入,如果是函數,進入函數

? ? ??3)c? 跳出循環,在循環后面設置斷點,然后按 c 可返回調用處

? ? ? 4)display? 和 p 相似,一直顯示變量

? ? ? 5)q? 退出 gbd 操作界面

三、各類排序算法的時間復雜度

1、概念

? ? ? ? 時間復雜度是衡量算法執行效率的重要指標,描述了算法的運行時間隨輸入規模(n)增長而變化的趨勢,而非具體的運行時間。

2、推導大O階方法

? ? ? ? 1)用常數 1 取代運行時間中的所有加法常數。

? ? ? ? 2)在修改后的運行次數函數中,只保留最高階項。

? ? ? ? 3)如果最高階項存在且不是 1 ,則去除與這個項相乘的常數。

得到的結構就是大O階。

3、表示方法

? ? ? ? 采用大O符號(Big O Notation)來表示,忽略了常數項、低階項和系數,只保留對增長趨勢影響最大的項。例如下圖:(圖中 階 代表時間復雜度)

4、常見時間復雜度(按效率高到低排序)

? ?1)常數階 O(1)

? ? ? ? 算法執行時間不隨規模 n 變化,始終為固定步驟,如訪問數組中的某個元素。

? ?2)對數階 O(log n)

? ? ? ? 執行時間隨 n 增長,但增長速度極慢(每步可將問題規模縮小一半),如二分查找。

? ?3)線形階 O(n)

? ? ? ? 執行時間與 n 成正比例增長,如線性查找。

? ?4)線形對數階 O(n log n)

? ? ? ? 效率介于 O(n) 和 O(n^2) 之間,常見于高效排序算法,如快速排序、歸并排序。

? ?5)平方階 O(n^2)

? ? ? ? 執行時間與 n 的平方成正比,適用于小規模數據,如冒泡排序。

?? 6)指數階 O(2^n)、階乘階 O(n!)4

? ? ? ? 效率極低,隨 n 增長,執行時間呈爆炸式增長,僅適用于極小規模數據。

5、各類算法時間復雜度整理

常用的時間復雜度所耗費的時間從小到大依次是:

【END】

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

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

相關文章

安全基礎DAY1-安全概述

信息安全現狀及挑戰常見術語信息安全的脆弱性及常見攻擊網絡環境的開放性其實就是人人可以上網&#xff0c;網上零成本。協議棧自身的脆弱性及常見攻擊協議棧自身的脆弱性常見安全風險網絡的基本攻擊模式物理層--物理攻擊前置知識 1.打開Apache服務 cd /etc/init.d ./apache2 s…

Claude Code 的核心能力與架構解析

技術分析介紹&#xff1a;Claude Code 的核心能力與架構解析一、概述 Claude Code 是由 Anthropic 推出的面向開發者的智能編碼助手&#xff0c;它不僅僅是一個代碼生成工具&#xff0c;更是一個具備記憶、工具調用、自主規劃和環境感知能力的“智能代理”&#xff08;Agentic …

Mac 電腦放在環境變量中的通用腳本

mac電腦下放在環境變量中&#xff0c;方便提高效率執行 注&#xff1a;相關路徑需要根據實際情況進行更新 需要在 .bash_profile 文件中定義如下&#xff08;路徑需要做實際替換&#xff09;&#xff1a; source $HOME/software/scripts/base_profile.sh source $HOME/software…

UE藍圖節點Add Impulse和Add Torque in Radians

???????Add Impulse&#xff1a;對剛體施加一次性的線性脈沖&#xff08;瞬時改變量&#xff09;&#xff0c;改變速度&#xff08;與質量有關&#xff0c;除非你勾 bVelChange&#xff09;。Add Torque (in Radians)&#xff1a;對剛體施加轉矩/旋轉力&#xff08;向量…

大型語言模型幻覺檢測與緩解技術研究綜述

摘要 本文系統綜述了大型語言模型(LLMs)中的幻覺現象及其檢測與緩解技術。研究首先從認知機制角度分析了幻覺產生的理論根源&#xff0c;包括模型對語言先驗的過度依賴、訓練數據偏差以及推理過程中的信息衰減等問題。在技術層面&#xff0c;綜述將現有方法歸納為三類&#xff…

【數據結構初階】--二叉樹(二)

&#x1f618;個人主頁&#xff1a;Cx330? &#x1f440;個人簡介&#xff1a;一個正在努力奮斗逆天改命的二本覺悟生 &#x1f4d6;個人專欄&#xff1a;《C語言》《LeetCode刷題集》《數據結構-初階》 前言&#xff1a;上篇博客我們學習了有關樹的概念和相關術語的介紹&…

jmm 指令重排 緩存可見性 Volatile 內存屏障

CPU指令重排 CPU指令重排是指CPU為了提高指令執行效率&#xff0c;可能會對指令的執行順序進行優化&#xff0c;使得&#xff08;單線程下&#xff09;指令的實際執行順序與代碼中的順序不同&#xff0c;但結果是一致的。 這種優化是通過亂序執行和緩存讀寫重排來實現的。 亂序…

卡車手機遠程啟動一鍵啟動無鑰匙進入有哪些好處

隨著汽車科技的發展&#xff0c;卡車智能化升級已成為趨勢&#xff0c;其中手機控車、遠程啟動、無鑰匙進入及一鍵啟動等功能顯著提升了駕駛便捷性與安全性。以下從功能特點、技術原理、適用場景及改裝建議等方面展開說明。一、核心功能及技術特點1. 無鑰匙進入系統自動感應操作…

【pyqt5】SP_(Standard Pixmap)的標準圖標常量及其對應的圖標

目錄 **常見SP_圖標分類及用途** **1. 箭頭和導航圖標** **2. 文件和編輯操作** **3. 系統狀態和通知** **4. 應用程序和菜單** **5. 數據視圖控件** **完整列表(部分)** **使用建議** **6. 數據操作圖標** **7. 編輯和文本操作** **8. 媒體控制圖標** **9. 系統和應用狀態**…

VS Git巨坑合并分支失敗導致多項無關改變

基于主分支創建的臨時分支上進行了一些開發&#xff0c;合并回主分支&#xff0c;期間主分支沒有進行任何更改還是創建臨時分支時的狀態&#xff0c;但合并莫名其妙報錯 “1 uncommitted …”&#xff0c;我可以確認主分支和臨時分支均沒有尚未提交的更改。更惡心的是&#xff…

開始記錄U9客開過程中聽點滴

很久沒有更新了。終于有時間可以拾起U9的研究當中。時間長了就生疏了很多&#xff0c;記錄下來備查吧。用這個工具可以生成一個VS 2022的項目&#xff0c;在指定的地方寫自已的代碼既可。BE插件&#xff0c;Busing Plugin 商業插件。總結一下&#xff0c;BE插件是應用于某一個單…

C# 異步編程(使用異步Lambda表達式)

使用異步Lambda表達式 到目前為止&#xff0c;本章只介紹了異步方法。但我們曾經說過&#xff0c;你還可以使用異步匿名方法和異步 Lambda表達式。這些構造尤其適合那些只有少量工作要做的事件處理程序。下面的代碼片段將 一個表達式注冊為一個按鈕點擊事件的事件處理程序。 st…

K8S云原生監控方案Prometheus+grafana

目錄 1. 概述 1.1 系統架構 1.1.1 架構圖 ?編輯 1.2 環境準備 2. 部署prometheus 2.1 創建Namespace 2.2 創建ConfigMap資源 2.3 創建ServiceAccount&#xff0c;Clusterrole&#xff0c;Clusterrolebinding&#xff0c;Service&#xff0c;Deployment&#xff0c;in…

Matplotlib庫:Python數據可視化的基石,發現它的美

Matplotlib是Python中最基礎、最廣泛使用的數據可視化庫&#xff0c;它提供了類似MATLAB的繪圖接口&#xff0c;能夠創建高質量的靜態、動態和交互式圖表。作為科學計算和數據可視化的核心工具&#xff0c;Matplotlib幾乎成為Python數據科學生態系統的標準可視化組件。 今天與…

每日算法刷題Day59:8.9:leetcode 隊列8道題,用時2h30min

一、基礎 1.套路 1.隊列常用在 BFS 中&#xff0c;見 網格圖題單 和 圖論題單。 2.隊列(queue)是容器適配器&#xff0c;功能較少。 隊尾插入元素&#xff0c;隊首彈出元素&#xff0c;可以訪問隊首元素、隊尾元素和隊列長度。 無begin(),end()等迭代器 queue<int> qu…

Java選手如何看待Golang

寫在前面&#xff1a;翻了很多博客&#xff0c;一直沒有Java選手轉行golang的學習經驗貼&#xff0c;思考很久&#xff0c;寫下這篇Java選手怎么看待golang這個冉冉新星。1.走完所有golang基礎之后的感受&#xff08;1&#xff09;最大的不適應有這么幾點&#xff1a;---變量定…

Codeforces Round 967 (Div. 2) D. Longest Max Min Subsequence

假設我們要選a[j]為答案數組b[i]&#xff0c;從i從1~m&#xff08;m為a數組中不同數的個數&#xff09;建立一個suf數組&#xff0c;代表以i開頭的后綴有多少個不同且在b[1~i-1]中未出現過的的個數&#xff0c;預處理suf&#xff0c;發現后續我們怎么選數改變suf&#xff0c;su…

Linux運維新手的修煉手扎之第27天

mysql服務1 主從復制集群&#xff1a;多主機集群【復制】負載過大解決方案&#xff1a;橫向擴展[增加服務器節點分散負載]、縱向擴展[提升單機硬件性能]復制工作原理&#xff1a;前提&#xff1a;基礎數據一樣&#xff0c;主節點上有同步數據用的賬號主角色【二進制日志、binlo…

【Linux】Linux增刪改查命令大全(附頻率評級)

Linux增刪改查命令大全&#xff08;附頻率評級&#xff09;* 《Linux命令全景手冊&#xff1a;增刪改查全場景解析&#xff08;含136個高頻命令&#xff09;》 按使用頻率★分級 | 測試/運維/開發均適用 | 附思維導圖下載一、命令全景表&#xff08;增刪改查頻率評級&#xff0…

SwiftUI 登錄頁面鍵盤約束沖突與卡頓優化全攻略

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…