0_1樹和圖

樹的概念

樹(tree)是一種能夠分層存儲數據的重要數據結構,樹中的每個元素被稱為樹的節點,每個節點有若干個指針指向子節點。從節點的角度來看,樹是由唯一的起始節點引出的節點集合。這個起始結點稱為根(root)。樹中節點的子樹數目稱為節點的度(degree)。在面試中,關于樹的面試問題非常常見,尤其是關于二叉樹(binary tree),二叉搜索樹(Binary Search Tree, BST)的問題。

所謂的二叉樹,是指對于樹中的每個節點而言,至多有左右兩個子節點,即任意節點的度小于等于2。而廣義的樹則沒有如上限制。二叉樹是最常見的樹形結構。二分查找樹是二叉樹的一種特例,對于二分查找樹的任意節點,該節點存儲的數值一定比左子樹的所有節點的值大比右子樹的所有節點的值小“(與之完全對稱的情況也是有效的:即該節點存儲的數值一定比左子樹的所有節點的值小比右子樹的所有節點的值大)。

基于這個特性,二分查找樹通常被用于維護有序數據。二分查找樹查找、刪除、插入的效率都會于一般的線性數據結構。事實上,對于二分查找樹的操作相當于執行二分搜索,其執行效率與樹的高度(depth)有關,檢索任意數據的比較次數不會多于樹的高度。這里需要引入高度的概念:對一棵樹而言,從根節點到某個節點的路徑長度稱為該節點的層數(level),根節點為第0層,非根節點的層數是其父節點的層數加1。樹的高度定義為該樹中層數最大的葉節點的層數加1,即相當于于從根節點到葉節點的最長路徑加1。由此,對于n個數據,二分查找樹應該以“盡可能小的高度存儲所有數據。由于二叉樹第L層至多可以存儲 2^L 個節點,故樹的高度應在logn量級,因此,二分查找樹的搜索效率為O(logn)。

直觀上看,盡可能地把二分查找樹的每一層“塞滿”數據可以使得搜索效率最高,但考慮到每次插入刪除都需要維護二分查找樹的性質,要實現這點并不容易。特別地,當二分查找樹退化為一個由小到大排列的單鏈表(每個節點只有右孩子),其搜索效率變為O(n)。為了解決這樣的問題,人們引入平衡二叉樹的概念。所謂平衡二叉樹,是指一棵樹的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。通過恰當的構造與調整,平衡二叉樹能夠保證每次插入刪除之后都保持平衡性。平衡二叉樹的具體實現算法包括AVL算法和紅黑算法等。由于平衡二叉樹的實現比較復雜,故一般面試官只會問些概念性的問題。

滿二叉樹(full binary tree):如果一棵二叉樹的任何結點,或者是葉節點,或者左右子樹都存在,則這棵二叉樹稱作滿二叉樹。

完全二叉樹(complete binary tree):如果一棵二叉樹最多只有最下面的兩層節點度數可以小于2,并且最下面一層的節點都集中在該層最左邊的連續位置上,則此二叉樹稱作完全二叉樹。

Free tree

指的是相互連接的無環無向圖

假設 G = (V, E) 是一個無向圖,那么下面的語句是等價的:

  1. G 是一個 free tree
  2. G 中的任意兩個節點間都有唯一的一條路徑
  3. G 是連通的的,但是如果去掉任何一條邊,G 就不連通了
  4. G 是連通的,并且 $|E|=|V|-1$
  5. G 是無環的,并且 $|E|=|V|-1$
  6. G 是無環的,但是加入任何一條新的邊,就會變成有環的

Forest 森林

同樣是無環無向圖,但不是所有的節點都是連通的

下圖中包含一個環,所以不能算是森林:

Rooted Tree

有根的樹也是一棵 free tree,但是其中一個節點和其他不同,稱為根。有根樹中有一些概念需要理解清楚,這里只列舉出來不再贅述:ancestor, descendant, proper ancestor, proper descendant, parent, child, siblings, external node(leaf), internal node。

一個節點的孩子數量稱之為節點的度(degree),從根到某節點的要經過的邊的數量就是該節點的深度,最大的深度稱為樹的高度。

根樹有幾個特例,也非常常用,需要理解清楚,這里列舉如下:

  • Binary tree
  • Full binary tree: each node is either a leaf or has degree exactly 2
  • Complete k-ary tree: a k-ary tree in which all leaves have the same depth and all internal nodes have degree k
  • Binary search tree: 一個節點的左右子節點和節點本身滿足一定的大小關系

樹的遍歷

這一部分也是非常重要的內容,基本來說各類考點都在這里,不但需要對概念的清晰理解,還需要利用遞歸來解決問題(雖然不用遞歸也可以),主要有下面這四類:

  1. 前序遍歷
  2. 中序遍歷
  3. 后序遍歷
  4. 層次遍歷

具體的概念可以在 wiki 上查看,注意一下層次遍歷可能需要一些特殊處理即可。

二叉樹的常見操作包括樹的遍歷,即以一種特定的規律訪問樹中的所有節點。常見的遍歷方式包括:

  • 前序遍歷(Pre-order traversal):訪問根結點;按前序遍歷左子樹;按前序遍歷右子樹。
  • 中序遍歷(In-order traversal):按中序遍歷左子樹;訪問根結點;按中序遍歷右子樹。特別地,對于二分查找樹而言,中序遍歷可以獲得一個由小到大或者由大到小的有序序列。
  • 后續遍歷(Post-order traversal):按后序遍歷左子樹;按后序遍歷右子樹;訪問根結點。

以上三種遍歷方式都是深度優先搜索算法(depth-first search)。深度優先算法最自然的實現方式是通過遞歸實現,事實上,大部分樹相關的面試問題都可以優先考慮遞歸。此外,另一個值得注意的要點是:深度優先的算法往往都可以通過使用棧數據結構將遞歸化為非遞歸實現。這里利用了棧先進后出的特性,其數據的進出順序與遞歸順序一致(請見 Stack and Queue) 。

層次遍歷(Level traversal):首先訪問第0層,也就是根結點所在的層;當第i層的所有結點訪問完之后,再從左至右依次訪問第i+1層的各個結點。層次遍歷屬于廣度優先搜索算法(breadth-first search)。廣度優先算法往往通過隊列數據結構實現。

B-Tree

如果我們想要表示一個 complete binary tree 的話,其實可以用數組來完成,這種結構其實也可以看成是一個堆。堆的話需要理解的不算特別多,注意下最大堆最小堆,以及對應的操作即可。另外前面提到的優先隊列也可以認為是堆,不過這個不展開了。

這一部分我們著重來看看 B-Tree,這是一類搜索樹,在給定 n 個節點的條件下,盡可能減少樹的高度,相對于原來的二叉搜索樹,B-Tree 做了兩個調整:

  1. 節點可以有多于兩個子節點
  2. 節點中可以保存多個元素

因為需要保存不定數量的元素,所以一般用 set 來實現(這種情況下不允許有重復的元素,重復的情況這里暫時不考慮)。稍微提一下,許多數據庫都是用 B-Tree 實現的。

所有的 B-Tree 都有一個非常重要的常數 MINIMUM,決定了每個節點中需要保存多少元素,具體的規則如下:

  1. 根節點有 0 或 1 個元素,其他的節點至少需要保存 MINIMUM 個元素
  2. 一個節點中最多可以保存 2*MINIMUM 個元素
  3. 一個節點中保存的元素是有序的,從最小到最大
  4. 假設一個非葉節點中存有 N 個元素,那么它會有 N+1 個子樹
  5. <

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

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

相關文章

從0搭建出海 Demo:免費香港服務器實戰指南

你有沒有在通勤地鐵上、午飯后摸魚時&#xff0c;突然冒出一個想法&#xff1a;“要不我也做個應用試試&#xff1f;好像不少人靠這個補貼生活開銷啊&#xff01;” 結果隨手搜了幾篇“海外項目經驗分享”&#xff0c;瞬間被一堆術語勸退&#xff1a;CDN、備案、分發平臺、服務…

《仿盒馬》app開發技術分享--未完成訂單列表展示邏輯優化(61)

技術棧 Appgallery connect 前言&#xff1a; 上一節我們實現訂單與優惠券的聯合提交時&#xff0c;我去到訂單列表頁面查看生成的訂單信息&#xff0c;發現現在的訂單從信息展示到價格計算全都是有問題的。所以緊急的把對應的問題修改一下。 問題來源&#xff1a; async …

手搓多模態-08 主模型的搭建(上)

前情回顧 在之前的章節我們已經構建好了視覺編碼器&#xff0c;預處理模塊&#xff0c;以及gemma模型的頂層。gemma模型的頂層&#xff0c;主要是構建圖中圈出的輸入&#xff0c;它把視覺編碼器里每個圖像patch的編碼維度對齊到自然語言token的嵌入維度&#xff0c;并組裝成了一…

Matlab 角點探測

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里實現一種角點探測功能,其思路仍然是借助圖像的局部梯度信息,實現亞像素精度的角點定位。該功能核心思想是利用角點周圍的局部梯度信息,通過加權最小二乘優化的方式迭代調整角點位置,使定位精度達到亞像素級別。整個…

錯誤監控----比如實現sentry一些思路

錯誤監控 ?、引? 1.為什么需要前端錯誤監控 你的腳本在哪些邊界條件下會報錯&#xff1f; 你的腳本和樣式兼容性如何&#xff1f; 有哪些地區不能正常訪問你的?站&#xff1f; 出現問題之后&#xff0c;你如何快速定位排查&#xff0c;把損失降到最低&#xff1f; 如果你想解…

linux內核調試

1. 前置安裝 1.1 編譯好的內核 參考&#xff1a; https://blog.csdn.net/qq_51950769/article/details/148596916 1.2 編譯busybox BusyBox 是一個非常輕量級的多合一工具箱&#xff0c;常被稱為“Linux 的瑞士軍刀”。 簡單來說&#xff1a; 它把很多常用的 Linux 命令&am…

什么是曲面細分

什么是曲面細分 在CAD格式中&#xff0c;通常使用曲線和數學函數來定義曲面和實體。這些曲面的精確度和光滑度非常適用于制造過程。但是&#xff0c;現代GPU芯片針對由三角形網格體組成的曲面的渲染計算進行了高度優化。通常&#xff0c;實時渲染器和虛幻之類的游戲引擎只能處…

CANFD加速是什么?和CANFD有什么區別?

文章目錄 摘要什么是CANFD加速?CAN FD的基本原理:仲裁階段(Arbitration Phase):數據階段(Data Phase):關鍵特性:優勢:總結摘要 下面的截圖,大家肯定不陌生,在使用CAN設備上位機的時候,已經選擇了CANFD,但還有一個選項是“CANFD加速”,那CANFD加速和不加速有什么…

minio 啟動失敗--Incorrect Usage: flag provided but not defined: -consoleaddress

根據錯誤信息 flag provided but not defined: -consoleaddress&#xff0c;這表明 Minio 服務啟動時使用了未定義的命令行參數 --consoleaddress&#xff0c;導致啟動失敗。這個問題與 Minio 版本兼容性有關。 問題原因 參數名稱變更&#xff1a; Minio 版本 > RELEASE.20…

基于Rust的Polars學習筆記

基于Rust的Polars學習筆記 Polars 學習筆記 Cargo.toml通用配置 [package] name = "rustP" version = "0.1.0" edition = "2024"[dependencies] polars = { version = "0.48.1", features = ["full"]}Quickstart use po…

SpringBoot擴展——定時任務!

定時任務 項目開發中會涉及很多需要定時執行的代碼&#xff0c;如每日凌晨對前一日的數據進行匯總&#xff0c;或者系統緩存的清理、對每日的數據進行分析和總結等需求&#xff0c;這些都是定時任務。單體系統和分布式系統的分布式任務有很大的區別&#xff0c;單體系統就一個…

RTDETRv2 pytorch 官方版自己數據集訓練遇到的問題解決

rtdetrv2 訓練問題遇到的問題。 pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu117 1 Please make sure torchvision version > 0.15.2 發現自己實際裝的是 torchvison0.15.2cu117 修改_misc.py中修改為…

Linux系統移植⑤:uboot啟動流程詳解-board_init_f執行過程

Linux系統移植⑤&#xff1a;uboot啟動流程詳解-board_init_f執行過程 _main 中會調用 board_init_f 函數。 board_init_f 函數主要有兩個工作&#xff1a; ①初始化一系列外設&#xff0c;比如串口、定時器&#xff0c;或者打印一些消息等。 ②初始化 gd 的各個成員變量&am…

Git命令與代碼倉庫管理

步驟一、完成Gitee碼云上賬號注冊并新建代碼倉庫。 1.1 新建代碼倉庫 1.2 填寫信息并創建 1.3 獲取倉庫地址 https://gitee.com/dog-kidney/2022082206.git 步驟二、建立本地代碼倉庫&#xff0c;并連接到遠程代碼倉庫。 2.1初始化 git init 2.2添加倉庫 git remote add o…

資源占用多,Linux 系統中如何降低 CPU 資源消耗并提升利用率?

在 Linux 系統中降低 CPU 資源消耗并提升利用率,需從系統服務優化、進程管理、資源調度及內核參數調整等多維度入手。以下是適用于各類 Linux 發行版的通用優化方案,涵蓋基礎操作與進階策略: 一、服務與進程優化:減少無效資源占用 1. 關閉冗余系統服務 查看運行中的服務 …

技術與情感交織的一生 (八)

目錄 融合 東西廠公 接風宴 頭痛 “巴巴羅薩” 突擊 推進 助攻 96小時 寒冬 食堂 反攻 消耗 Delphi 西廠 內困 外患 “敦刻爾克” 多線作戰 大撤退 資源 融合 東西廠公 初次來到紙箱廠&#xff0c;是主廠區&#xff0c;感覺很大&#xff0c;相對西面正在…

webuploader分片上傳示例,服務端上傳文件到騰訊云CDN Teo 應用示例

本文環境&#xff1a;php7.3.4 CI3.0框架 一、大概步驟&#xff1a; &#xff08;1&#xff09;利用百度的webuploader插件&#xff0c;將大文件分片上傳的自己的服務器 &#xff08;2&#xff09;利用騰訊云接口從本服務器上傳到騰訊云 二、詳細代碼&#xff1a; 1、進入…

LeetCode 632.最小區間

你有 k 個 非遞減排列 的整數列表。找到一個 最小 區間&#xff0c;使得 k 個列表中的每個列表至少有一個數包含在其中。 我們定義如果 b-a < d-c 或者在 b-a d-c 時 a < c&#xff0c;則區間 [a,b] 比 [c,d] 小。 示例 1&#xff1a; 輸入&#xff1a;nums [[4,10,…

篇章五 系統性能優化——資源優化——CPU優化(2)

目錄 1.高級并發模式 1.1 工作竊取&#xff08;Work Stealing&#xff09; 1.工作竊取模式 2.ForkJoinPool實現 3.具體例子 1.2 結構化并發&#xff08;Structured Concurrency&#xff09; 1.結構化并發模式 2.Java 19 的 StructuredTaskScope 3.具體例子 1.3 對比與…

《中國電信運營商骨干網:歷史、現狀與未來演進》系列 第四篇:后發先至——中國移動CMNET的快速擴張與IP專網布局

摘要&#xff1a; 本文深入探討中國移動骨干網CMNET (AS9808) 的發展歷程、網絡架構及其與中國電信扁平化策略的差異。同時&#xff0c;解析其為承載高價值業務而構建的IP專用承載網的定位、結構與技術特點。最后&#xff0c;展望中國移動在5G、云計算和算力網絡時代&#xff0…