主頁 >  其他 > 【技識訓累】資料結構中的二叉樹【一】

【技識訓累】資料結構中的二叉樹【一】

2023-06-11 07:48:32 其他

什么是二叉樹

二叉樹是一種樹形資料結構,由節點組成,每個節點最多有兩個子節點,分別稱為左子節點和右子節點,在二叉樹中,每個節點的左子節點小于該節點的值,在該節點的右側的子節點大于該節點的值,

二叉樹的特點是易于搜索、插入和洗掉操作,

  1. 在搜索時,從根節點開始,如果被查找值等于當前節點的值,則搜索結束,
  2. 如果當前節點的值大于被查找值,則繼續搜索左子節點;
  3. 如果當前節點的值小于被查找值,則繼續搜索右子節點,
  4. 插入和洗掉節點的操作也類似,

二叉樹可分為滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜索樹等多種型別,不同型別的二叉樹有不同的特點和應用場景,

  1. 滿二叉樹是每個節點都有兩個子節點的二叉樹
  2. 完全二叉樹則是除了最后一層節點之外,每一層節點都是滿的,最后一層節點從左往右排列,
  3. 平衡二叉樹是指左右子樹高度差不超過1的二叉樹,
  4. 二叉搜索樹是按照特定規則構建的二叉樹,每個節點的左子節點小于該節點的值,在該節點的右側的子節點大于該節點的值,

二叉樹在計算機科學領域中有廣泛的應用,例如在搜索演算法、編譯器、資料庫、作業系統等領域,

二叉樹的高度,深度,寬度,平衡是什么

1. 二叉樹的高度:

二叉樹的高度是指從根節點到最深節點的距離,即根節點到最遠葉子節點的最短路徑,一般使用遞回演算法來計算二叉樹的高度,即樹的高度等于左子樹高度和右子樹高度中的較大值加一,

例如,對于下圖所示的二叉樹,其高度為4:

                    A
                   /  \
                  B    C
                 / \    \
                D   E    F
                           \
                            G

 

2. 二叉樹的深度:

二叉樹的深度是指從根節點到某個節點的距離,即從根節點到該節點的路徑上經過的節點數,如果該節點是根節點,則深度為0,否則深度等于其父節點的深度加一,

例如,對于上圖中的節點B,其深度為1,節點G的深度為3,

 

3.二叉樹的寬度:

二叉樹的寬度指的是二叉樹某一層中最多節點的個數,為了計算樹的寬度,需要使用BFS(廣度優先搜索)演算法,從根節點開始逐層遍歷二叉樹,記錄每一層中節點的個數(即該層寬度),然后取所有層寬度的最大值即可,

例如,對于下面這棵二叉樹:

        A
      /   \
     B     C
   /  \      \
  D    E      F

如果從根節點開始遍歷二叉樹,每一層中節點的個數為:

* 第1層:1個節點
* 第2層:2個節點
* 第3層:3個節點

因此,這棵二叉樹的寬度是3,

需要注意的是,如果二叉樹的某一層節點數目很少,那么這一層的寬度可能會影響樹的整體寬度,在實際應用中,通常會根據具體場景選擇不同的度量標準,如節點數、邊數、占用的存盤空間等,

 

4. 平衡二叉樹:

平衡二叉樹是指一棵二叉樹,其中任意節點的左右子樹的深度差不超過1,在平衡二叉樹中,所有節點的左右子樹深度差別不大,能夠保證樹在查詢、插入和洗掉操作時,均能保持較高的性能表現,

例如,下圖所示的二叉樹就是一棵平衡二叉樹:

               A
            /    \
           B      C
          / \    / \
         D   E  F   G

左右子樹的深度差不超過1,左子樹深度為2,右子樹深度為2,因此它是一棵平衡二叉樹,

 

二叉樹的節點數和高度與葉子節點數的關系是什么?

二叉樹的節點數與高度的關系可以表示為:如果二叉樹的高度為h,則節點總數為2^(h+1) - 1

葉子節點數與高度的關系可以表示為:如果二叉樹的高度為h,則葉子節點總數最多為2^h,最少為2^(h-1),

因此,葉子節點數的范圍是 [2^(h-1), 2^h],并且二叉樹的葉子節點數和節點總數之間的關系是近似線性的,

 

二叉樹前序遍歷

1. 概念

前序遍歷是二叉樹遍歷的一種方法,也叫做先根遍歷,在前序遍歷中,首先訪問根節點,然后依次遍歷其左子樹和右子樹,具體來說,在前序遍歷中,每個節點的訪問順序為:根節點 → 左子樹 → 右子樹,

2. 步驟

前序遍歷的步驟如下:

(1) 訪問二叉樹的根節點,

(2) 遞回遍歷左子樹,直到左子樹為空,

(3) 遞回遍歷右子樹,直到右子樹為空,

3. 偽代碼

前序遍歷的偽代碼如下:

function preorderTraversal(root) {
    if (root == null) {
        return;
    }
    visit(root); // 訪問根節點
    preorderTraversal(root.left); // 遍歷左子樹
    preorderTraversal(root.right); // 遍歷右子樹
}

二叉樹中序遍歷

1. 概念

中序遍歷是二叉樹遍歷的一種方法,在中序遍歷中,二叉樹的節點按照以下順序依次遍歷:左子樹 → 根節點 → 右子樹,

2. 步驟

中序遍歷的步驟如下:

(1) 遞回遍歷左子樹,直到左子樹為空,

(2) 訪問二叉樹的根節點,

(3) 遞回遍歷右子樹,直到右子樹為空,

3. 偽代碼

中序遍歷的偽代碼如下:

function inorderTraversal(root) {
    if (root == null) {
        return;
    }
    inorderTraversal(root.left); // 遍歷左子樹
    visit(root); // 訪問根節點
    inorderTraversal(root.right); // 遍歷右子樹
}

二叉樹后續遍歷

1. 概念

后序遍歷是二叉樹遍歷的一種方法,在后序遍歷中,二叉樹的節點按照以下順序依次遍歷:左子樹 → 右子樹 → 根節點,

2. 步驟

后序遍歷的步驟如下:

(1) 遞回遍歷左子樹,直到左子樹為空,

(2) 遞回遍歷右子樹,直到右子樹為空,

(3) 訪問二叉樹的根節點,

3. 偽代碼

后序遍歷的偽代碼如下:

function postorderTraversal(root) {
    if (root == null) {
        return;
    }
    postorderTraversal(root.left); // 遍歷左子樹
    postorderTraversal(root.right); // 遍歷右子樹
    visit(root); // 訪問根節點
}

二叉樹查找操作復雜度

二叉搜索樹中查找某個元素的步驟如下:

1. 從二叉搜索樹的根節點開始遍歷,

2. 如果當前節點為空,則回傳null;如果當前節點的值等于目標值,則回傳當前節點,

3. 如果當前節點的值大于目標值,則以當前節點的左子樹為目標繼續查找;如果當前節點的值小于目標值,則以當前節點的右子樹為目標繼續查找,

4. 重復執行第2和第3步,直到找到目標節點或者遍歷至葉子節點為止,

偽代碼如下所示:

function search(root, target):
    if (root == null) return null // 如果根節點為空,則直接回傳null
    if (root.value =https://www.cnblogs.com/yyyyfly1/p/= target) return root // 如果根節點的值等于目標值,則回傳根節點
    
    if (root.value > target) // 如果根節點的值大于目標值,則在左子樹中查找
        return search(root.left, target)
    else // 如果根節點的值小于目標值,則在右子樹中查找
        return search(root.right, target)

二叉搜索樹中查找某個元素的時間復雜度是O(log N),其中N為二叉搜索樹中節點的數量,這是因為每次查找都會將搜索區域縮小一半,因此查找的次數最多是二叉樹深度的兩倍,而二叉樹深度是log N級別的,

二叉樹插入操作

1. 概念

二叉搜索樹是一種特殊的二叉樹,它滿足以下性質:對于每個節點,它的左子樹的所有節點的值小于該節點的值,它的右子樹的所有節點的值大于該節點的值,

插入操作是指向二叉搜索樹中添加新節點的程序,使得二叉搜索樹仍然保持其有序性,

2. 步驟

二叉搜索樹的插入操作步驟如下:

(1) 從根節點開始查找,比較當前節點的值和待插入節點的值,

(2) 如果當前節點為空,則將待插入節點插入到該位置,完成插入操作,

(3) 如果待插入節點的值小于當前節點的值,則在左子樹中繼續查找,

(4) 如果待插入節點的值大于當前節點的值,則在右子樹中繼續查找,

(5) 對查找到的節點重復上面的操作,直到找到合適的位置將待插入節點插入到樹中,

3. 偽代碼

二叉搜索樹的插入操作的偽代碼如下:

function insert(root, val) {
    if (root == null) {
        root = new TreeNode(val);
        return root;
    }
    if (val < root.val) {
        root.left = insert(root.left, val);
    } else if (val > root.val) {
        root.right = insert(root.right, val);
    }
    return root;
}

二叉樹的洗掉操作

1. 概念

二叉搜索樹的洗掉操作是指從二叉搜索樹中洗掉一個節點的程序,同時保證洗掉后的二叉搜索樹仍然滿足其有序性質,

2. 步驟

二叉搜索樹的洗掉操作步驟如下:

(1) 如果待洗掉節點為葉子節點,則直接洗掉該節點,

(2) 如果待洗掉節點只有一個子節點,則將該子節點替換到待洗掉節點的位置,

(3) 如果待洗掉節點有兩個子節點,則先找到右子樹的最小值節點,使用該節點替換待洗掉節點,并遞回洗掉右子樹中的最小值節點,

3. 偽代碼

二叉搜索樹的洗掉操作的偽代碼如下:

function deleteNode(root, key) {
    if (root === null) {
        return null;
    } else if (key < root.val) {
        root.left = deleteNode(root.left, key);
    } else if (key > root.val) {
        root.right = deleteNode(root.right, key);
    } else {
        if (root.left === null && root.right === null) {
            root = null;
        } else if (root.left === null) {
            root = root.right;
        } else if (root.right === null) {
            root = root.left;
        } else {
            let minNode = findMin(root.right);
            root.val = minNode.val;
            root.right = deleteNode(root.right, minNode.val);
        }
    }
    return root;
}

function findMin(node) {
    while (node.left !== null) {
        node = node.left;
    }
    return node;
}

二叉樹的遍歷可以用來做什么

1. 二叉樹的中序遍歷可以用來做什么?

二叉樹的中序遍歷方法是先訪問左子樹,再訪問根節點,最后訪問右子樹;因此,中序遍歷可以幫助我們實作以下操作:

(1)從小到大遍歷二叉搜索樹:因為按照中序遍歷的順序,所有節點的值都會按從小到大的順序輸出,所以可以用中序遍歷將二叉搜索樹中的節點從小到大遍歷,

(2)創建二叉搜索樹:可以通過將節點按照中序遍歷的順序依次插入二叉搜索樹來創建一顆新的二叉搜索樹,

(3)查找二叉搜索樹中的節點:通過進行中序遍歷,可以找到指定值的節點,

2. 二叉樹的后序遍歷可以用來做什么?

二叉樹的后序遍歷方法是先訪問左子樹,再訪問右子樹,最后訪問根節點;因此,后序遍歷可以幫助我們實作以下操作:

(1)計算二叉樹運算式:可以通過后序遍歷以及堆疊的資料結構來計算二叉樹運算式,

(2)釋放二叉樹節點:通過后序遍歷的方式釋放二叉樹的每一個節點,

(3)構建二叉樹的鏡像:通過后序遍歷的方式,可以先構建出原二叉樹的鏡像的右子樹,再構建出鏡像的左子樹,最后創建根節點,獲得二叉樹的鏡像樹,

3. 二叉樹的前序遍歷可以用來做什么?

二叉樹的前序遍歷方法是先訪問根節點,再訪問左子樹,最后訪問右子樹;因此,前序遍歷可以幫助我們實作以下操作:

(1)序列化二叉樹:可以按照前序遍歷的順序將二叉樹轉換為字串,從而進行序列化操作,

(2)還原二叉樹:通過前序遍歷和中序遍歷的結果,可以還原出原二叉樹的結構,

(3)構建二叉搜索樹:可以通過前序遍歷的順序依次插入節點來構建二叉搜索樹,

在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/554847.html

標籤:其他

上一篇:配置證書與https

下一篇:返回列表

標籤雲
其他(160750) Python(38219) JavaScript(25491) Java(18216) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7245) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4589) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1957) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1880) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 【技識訓累】資料結構中的二叉樹【一】

    博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-06-11 07:48:32 more
  • 配置證書與https

    申請證書 筆者是騰訊云申請的證書 根據需求選擇下載證書 筆者使用的Nginx的方法 下載后解壓即可看到內容 配置 Nignx 參考文獻 SSL 證書 Nginx 服務器 SSL 證書安裝部署-證書安裝-檔案中心-騰訊云 (tencent.com) 我的nignx配置如下 server { #SSL ......

    uj5u.com 2023-06-11 07:46:22 more
  • 作為「碼農」的第一個十年

    十年 如果從上大學, 閉門造車似地搗鼓ActionScript3開始, 已經寫了10年代碼了. AS3 Java、Struts2、Hibernate、HTML、Javascript、CSS、SVN、Git、SQL Server、MySQL、Android Linux、PHP、ThinkPHP、Cav ......

    uj5u.com 2023-06-11 07:46:05 more
  • 程式員需要達到什么水平才能不被性別歧視?順利拿到 20k 無壓力?

    雙非本科,自認為技術水平不差,8月從美圖實習離職回學校,各種倒霉的事不斷,到現在11月,為了找個好的環境復習,9月又在學校附近租了房,基本是沒有面試通知就學不進去,前面由于過于自信,也沒拿個保底的offer,也只去湖大跑過一次58到家的宣講會,各種面試基本二面掛,最慘的一次的就是美團電話一面后,面試... ......

    uj5u.com 2023-06-11 07:38:58 more
  • 讀改變未來的九大演算法筆記08_并非萬能的演算法

    ![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230609163604504-1485199592.png) # 1. 有些問題根本不可能通過計算機解決,不管計算機有多強大或人類程式員有多聰明 # 2. 不可計算問題 ## ......

    uj5u.com 2023-06-10 08:33:17 more
  • DosBox環境配置

    # DosBox環境配置 DOSBox 是一個基于 x86 架構的 PC 的模擬器,它允許用戶在現代作業系統上運行 DOS 程式。DOSBox 是自由軟體,可以在 Windows、Linux ,macOS 等作業系統平臺上運行。 DOSBox 最初的設計目標是為那些依賴 MS-DOS 作業系統(即停 ......

    uj5u.com 2023-06-10 08:33:10 more
  • cocos2d-x 3.17 推箱子 0.1

    # 簡述 ## sokoban-cocos2dx 此版本為推箱子游戲的基礎版本, 后續添加如下功能 1. 人物影片 2. TiledMap 決議 3. 射線碰撞檢測 4. 下一步提示, C++演算法決議 5. 道具, 可以回退一步 ## 原始碼運行方式 ~~通過 `cocos` 命令新建一個專案, 將本 ......

    uj5u.com 2023-06-10 08:33:01 more
  • [Week 20]每日一題(C++,圖論,數學,搜索)

    [TOC] ## T1 [Daimayuan] Collision(C++,多源最短路) #### 題目描述 $siyisss$ 的王國是由 $n$ 個村鎮和 $n?1$ 條雙向道路構成的,村鎮從 $1$ 到 $n$ 依次編號,每條雙向道路連接兩個不同的村鎮,使得從任意一個村鎮出發都可以到達任意一個 ......

    uj5u.com 2023-06-10 08:32:53 more
  • 帶你體驗AI系列之云原生最佳實踐--免費體驗GPT-4教程

    ## 前言 ? 【GPT-4】是OpenAI最新推出的大型語言模型,它支持影像和文本輸入,以文本形式輸出。它比GPT-3.5更大、更強、更猛。最重要的是據與研究表明,他在某些場景下,可以通過圖靈測驗。但是,卻缺點是收費,不像GPT-3.5那樣容易白嫖。不過今天我就帶你嫖一手,真香警告!本教程可稱為云 ......

    uj5u.com 2023-06-10 08:32:33 more
  • 網路傳輸中的重要引數-談談帶寬

    [toc] 除了上篇提到的[RTT與丟包率](https://www.cnblogs.com/mapleumr/p/17464980.html),大多數人更關心的也許是網路的帶寬(Bandwidth,Bw),畢竟電信、聯通等公司廣告主打的就是一個百兆、千兆帶寬,聽著嘎嘎猛。 很自然的一個認知是,帶寬 ......

    uj5u.com 2023-06-10 08:32:19 more