數據結構(精講)----樹(應用篇)

特性:

什么是樹:

樹(Tree)是(n>=0)個節點的有限集合T,它滿足兩個條件:

(1) 有且僅有一個特定的稱為根(Root)的節點。

(2) 其余的節點可以分為m(m≥0)個互不相交的有限集合T1、T2、……、Tm,其中每一個集合又是一棵樹,并稱為其根的子樹(Subtree)。

樹的特性:

層次關系,一對多,每個節點最多有一個前驅,但是可以有多個后繼(根節點無前驅,葉節點無后繼)。

關于樹的節點:和鏈表類似,樹存儲結構中也將存儲的各個元素稱為 "結點"。

關于樹的一些術語:

(1) 度數:一個節點的子樹的個數 (一個節點有幾個孩子為該節點度數)

(2) 樹度數:樹中節點的最大度數

(3) 葉節點或終端節點: 度數為零的節點

(4) 分支節點:度數不為零的節點 (A B C D E H)

(5) 內部節點:除根節點以外的分支節點 (去掉根和葉子)

(6) 節點層次: 根節點的層次為1,根節點子樹的根為第2層,以此類推

(7) 樹的深度或高度: 樹中所有節點層次的最大值

二叉樹:

最多只有倆孩子的樹,并且分為左孩子和右孩子。

什么是二叉樹:

二叉樹(Binary Tree)是n(n≥0)個節點的有限集合,它或者是空集(n=0), 或者是由一個根節點以及兩棵互不相交的、分別稱為左子樹和右子樹的二叉樹組成。

二叉樹與普通有序樹不同,二叉樹嚴格區分左孩子和右孩子,即使只有一個子節點也要區分左右。

二叉樹的性質(**)

(1) 二叉樹第k(k>=1)層上的節點最多為2的k-1次冪 // 2^(k-1)

(2) 深度為k(k>=1)的二叉樹最多有2的k次冪-1個節點。//滿二叉樹的時候

做多的節點數 2^k-1

(3) 在任意一棵二叉樹中,樹葉的數目比度數為2的節點的數目多一。

設度數為0的節點數為n0,度數為1的節點數為n1以及度數為2的節點數為n2,則:

總節點數為各類節點之和:n=n0+n1+n2

總節點數為所有子節點數加一:n=n0*0+n1*1+n2*2+1

下面式子減上面式子得:0=-n0+n2+1==>n0 = n2 + 1

滿二叉樹和完全二叉樹

滿二叉樹: 深度為k(k>=1)時節點數為2^k - 1(2的k次冪-1)

完全二叉樹: 只有最下面兩層有度數小于2的節點,且最下面一層的葉節點集中在最左邊的若干位置上。(先掛樹的左邊向右, 從上向下掛)

二叉樹的存儲結構:

二叉樹的順序結構:

順序存儲結構 :完全二叉樹節點的編號方法是從上到下,從左到右,根節點為1號節點。設完全二叉樹的節點數為n,某節點編號為i:

● 當i>1(不是根節點)時,有父節點,其父節點編號為i/2;

● 當2*i<=n時,有左孩子,其編號為2*i ,否則沒有左孩子,本身是葉節點;

● 當2*i+1<=n時,有右孩子,其編號為2*i+1 ,否則沒有右孩子;

有n個節點的完全二叉樹可以用有n+1 個元素的數組進行順序存儲,節點號和數組下標一一對應,下標為零的元素不用。

利用以上特性,可以從下標獲得節點的邏輯關系。不完全二叉樹通過添加虛節點構成完全二叉樹,然后用數組存儲,

二叉樹的遍歷(*)

前序: 根 ----> 左 -----> 右

中序: 左 ----> 根 -----> 右

后序: 左 ----> 右 -----> 根

例如:

前序:A B C D E F G H K

中序:B D C A E H G K F

后序:D C B H K G F E A

練習:

已知遍歷結果如下,試畫出對應的二叉樹。

前序: A B C E H F I J D G K

中序:A H E C I F J B D K G

提示:用前序確定根節點,然后用中序找到根節點然后再找左右子。

練習:

(2) 深度為8的二叉樹,其最多有( 255) 個節點,第8層最多有(128 )個節點

(3) 數據結構中,沿著某條路線,一次對樹中每個節點做一次且僅做一次訪問,對二叉樹的節點從1開始進行連續編號,要求每個節點的編號大于其左、右孩子的編號,同一節點的左右孩子中,其左孩子的編號小于其右孩子的編號,可采用(C )次序的遍歷實現編號(網易)

A 先序 B 中序 C 后序 D 從根開始層次遍歷

(4)一顆二叉樹的 前序: A B D E C F, 中序:B D A E F C 問樹的深度是 ( B) (網易)

A 3 B 4 C 5 D 6

二叉樹的鏈式存儲

用鏈表實現,基于完全二叉樹規律來構建樹,按照完全二叉樹的編號方法,從上到下,從左到右。一共n個節點。

第i個節點:

左子節點編號:2*i(2*i<=n)

右子節點編號:2*i+1(2*i+1<=n)

可以根據左右節點編號來判斷是否對二叉樹構建完成

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{int data;            //數據域存數據struct node *lchild; //左子struct node *rchild; //右子
} node_t, *node_p;//創建二叉樹,用遞歸函數創建
node_p CreateBitree(int n, int i) //i 根節點的編號,n:節點數
{//創建根節點node_p r = (node_p)malloc(sizeof(node_t));if (NULL == r){perror("r malloc err");return NULL;}//初始化根節點r->data = i;if (2 * i <= n)r->lchild = CreateBitree(n, 2 * i);elser->lchild = NULL;if (2 * i + 1 <= n)r->rchild = CreateBitree(n, 2 * i + 1);elser->rchild = NULL;return r;
}//前序
void PreOrder(node_p r)
{if (NULL == r)return;             //直接結束函數無返回值printf("%d ", r->data); //根if (r->lchild != NULL)PreOrder(r->lchild); //左if (r->rchild != NULL)PreOrder(r->rchild); //右
}//中序
void InOrder(node_p r)
{if (NULL == r)return; //直接結束函數無返回值if (r->lchild != NULL)InOrder(r->lchild); //左printf("%d ", r->data); //根if (r->rchild != NULL)InOrder(r->rchild); //右
}//后序
void PostOrder(node_p r)
{if (NULL == r)return; //直接結束函數無返回值if (r->lchild != NULL)PostOrder(r->lchild); //左if (r->rchild != NULL)PostOrder(r->rchild); //右printf("%d ", r->data); //根
}int main(int argc, char const *argv[])
{node_p root = CreateBitree(5, 1);PreOrder(root);printf("\n");InOrder(root);printf("\n");PostOrder(root);printf("\n");return 0;
}

層次遍歷

層次遍歷(隊列思想)一定要懂

補充知識點(哈夫曼樹)

哈夫曼樹

哈夫曼樹又稱為最優樹.

給定N個權值作為N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

概念:

1、路徑和路徑長度

在一棵樹中,從一個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第L層結點的路徑長度為L-1。

2、結點的權及帶權路徑長度

若將樹中結點賦給一個有著某種含義的數值,則這個數值稱為該結點的權。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。

3、樹的帶權路徑長度

樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為WPL。(

Weighted Path Length of Tree)

WPL=2*2+5*2+7*1=21

赫夫曼樹的構造

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:

(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合并,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,并將新樹加入森林;

(4)重復(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

例如:對 2,3,4,8 這四個數進行構造:

第一步:

第二步:

第三步:

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

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

相關文章

【動態規劃】--- 斐波那契數模型

Welcome to 9ilks Code World (??? ? ???) 個人主頁: 9ilk (??? ? ???) 文章專欄&#xff1a; 算法Journey &#x1f3e0; 第N個泰波那契數模型 &#x1f4cc; 題目解析 第N個泰波那契數 題目要求的是泰波那契數&#xff0c;并非斐波那契數。 &…

如何確保Spring單例Bean在高并發環境下的安全性?

在Spring中&#xff0c;單例Bean就像是一個“公共的水杯”&#xff0c;整個應用程序中的所有線程都會共享這一個實例。在大部分情況下&#xff0c;這沒什么問題&#xff0c;但如果多個線程同時想要修改這個“水杯”里的內容&#xff0c;就可能會出現問題了。 想象一下&#xff…

期刊審稿意見回復的LaTeX模板分享

下載網址 https://github.com/NeuroDong/Latex_for_review_comments 效果展示 分享內容 在學術寫作過程中&#xff0c;回復審稿意見是一個重要且繁瑣的環節。由于審稿人眾多&#xff0c;使用Word進行排版往往效率低下。為了提高效率&#xff0c;我在網上找到了一個LaTeX模板…

Vue 3 30天精進之旅:Day 03 - Vue實例

引言 在前兩天的學習中&#xff0c;我們成功搭建了Vue.js的開發環境&#xff0c;并創建了我們的第一個Vue項目。今天&#xff0c;我們將深入了解Vue的核心概念之一——Vue實例。通過學習Vue實例&#xff0c;你將理解Vue的基礎架構&#xff0c;掌握數據綁定、模板語法和指令的使…

在Vue中,<img> 標簽的 src 值

1. 直接指定 src 的值&#xff08;適用于網絡圖片&#xff09; 如果你使用的是網絡圖片&#xff08;即圖片的URL是完整的HTTP或HTTPS鏈接&#xff09;&#xff0c;可以直接指定 src 的值&#xff1a; vue 復制 <template><div><img src"https://exampl…

Spring Boot/MVC

一、Spring Boot的創建 1.Spring Boot簡化Spring程序的開發,使用注解和配置的方式開發 springboot內置了tomact服務器 tomact:web服務器,默認端口號8080,所以訪問程序使用8080 src/main/java:Java源代碼 src/main/resource:靜態資源或配置文件,存放前端代碼(js,css,html) s…

Spring--SpringMVC的調用流程

一.簡介 1.1主要作用 SSM框架構建起單的技術棧需求&#xff01;其中的SpringMVC負責表述層&#xff08;控制層&#xff09;實現簡化&#xff01; 最終總結&#xff1a; 1. 簡化前端參數接收( 形參列表 )2. 端數據響應(返回值)1.2核心組件和調用流程 Spring MVC與許多其他Web…

C#集合排序的三種方法(List<T>.Sort、LINQ 的 OrderBy、IComparable<T> 接口)

見過不少人、經過不少事、也吃過不少苦&#xff0c;感悟世事無常、人心多變&#xff0c;靠著回憶將往事串珠成鏈&#xff0c;聊聊感情、談談發展&#xff0c;我慢慢寫、你一點一點看...... 1、使用 List<T>.Sort 方法與自定義比較器 public class Person{public string …

從ChatGPT熱潮看智算崛起

2025年1月7日&#xff0c;科智咨詢發布《2025年IDC產業七大發展趨勢》&#xff0c;其中提到“ChatGPT開啟生成式AI熱潮&#xff0c;智能算力需求暴漲&#xff0c;算力供給結構發生轉變”。 【圖片來源于網絡&#xff0c;侵刪】 為何會以ChatGPT發布為節點呢&#xff1f;咱們一起…

Frida使用指南(三)- Frida-Native-Hook

1.Process、Module、Memory基礎 1.Process Process 對象代表當前被Hook的進程,能獲取進程的信息,枚舉模塊,枚舉范圍等 2.Module Module 對象代表一個加載到進程的模塊(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件), 能查詢模塊的信息,如模塊的基址、名…

Electron學習筆記,安裝環境(1)

1、支持win7的Electron 的版本是18&#xff0c;這里node.js用的是14版本&#xff08;node-v14.21.3-x86.msi&#xff09;云盤有安裝包 Electron 18.x (截至2023年仍在維護中): Chromium: 96 Node.js: 14.17.0 2、安裝node環境&#xff0c;node-v14.21.3-x86.msi雙擊運行選擇安…

漏洞修復:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目錄 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修復建議升級Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修復建議III 安全警告引言 解決方案:升級到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…

提示詞的藝術 ---- AI Prompt 進階(提示詞框架)

提示詞的藝術 ---- AI Prompt 進階&#xff08;提示詞框架&#xff09; 寫在前面 上周發布了一篇《提示詞的藝術----AI Prompt撰寫指南》&#xff0c;旨在幫助讀者理解提示詞的作用&#xff0c;以及簡單的提示詞撰寫指南。本篇作為進階內容&#xff0c;將給出常用的提示詞框架…

PyQt4 的圖片切割編輯器

一、 編輯器功能明確 允許用戶加載圖片、選擇切割模式、對切割后的圖片片段進行操作&#xff08;如移動、復制、粘貼、刪除等&#xff09;&#xff0c;并支持撤銷和重做操作。 環境&#xff1a;Py2.7 PyQt 4.11 二、導入模塊介紹 sys: 用于訪問與 Python 解釋器強相關的變…

[MySQL]數據庫表內容的增刪查改操作大全

目錄 一、增加表數據 1.全列插入與指定列插入 2.多行數據插入 3.更新與替換插入 二、查看表數據 1.全列查詢與指定列查詢 2.查詢表達式字段 3.為查詢結果起別名 4.結果去重 5.WHERE條件 6.結果排序 7.篩選分頁結果 8.插入查詢的結果 9.group by子句 三、修改表數…

在 Windows 11 中為 SMB 3.x 文件共享協議提供 RDMA 支持

注&#xff1a;機翻&#xff0c;未校。 Enable SMB Direct in Windows 11 在 Windows 11 中啟用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 為 SMB 3.x 文件共享協議提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…

electron打包客戶端在rk3588上支持h265硬解

目錄 前言 chromium是如何支持h265硬解 electron/chromium第一次編譯 electron/chromium第二次編譯 前言 我們的客戶端程序是用electron打包的前端程序&#xff0c;其在rk3588主機上的linux環境運行。之前使用客戶端查看h264編碼的視頻直播是沒有問題的&#xff0c;但視頻源…

什么是網絡爬蟲?Python爬蟲到底怎么學?

最近我在研究 Python 網絡爬蟲&#xff0c;發現這玩意兒真是有趣&#xff0c;干脆和大家聊聊我的心得吧&#xff01;咱們都知道&#xff0c;網絡上的信息多得就像大海里的水&#xff0c;而網絡爬蟲就像一個勤勞的小礦工&#xff0c;能幫我們從這片浩瀚的信息海洋中挖掘出需要的…

【Jave全棧】Java與JavaScript比較

文章目錄 前言一、Java1、 歷史與背景2、語言特點3、應用場景4、生態系統 二、JavaScript1、歷史與背景2、語言特點3、應用場景4、 生態系統 三、相同點四、不同點1、語言類型2、用途3、語法和結構4、性能5、生態系統6、開發模式 前言 Java和JavaScript是兩種不同的編程語言&a…

GitCode 助力 AutoTable:共創 MyBatis 生態的自動表格管理新篇章

項目倉庫https://gitcode.com/dromara/auto-table 解放雙手&#xff0c;專注業務&#xff1a;MyBatis 生態的“自動表格”創新 AutoTable 是一款致力于為 MyBatis 生態賦予“自動表格”功能的創新插件。其核心理念是通過 Java 實體類自動生成和維護數據庫的表結構&#xff0c…