99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

樹(shù)的遞歸結(jié)構(gòu)和樹(shù)的存儲(chǔ)結(jié)構(gòu)分析

454398 ? 來(lái)源:機(jī)器之心 ? 作者:小小 ? 2020-10-16 14:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

樹(shù)的遞歸結(jié)構(gòu)

從一張圖中解釋什么是樹(shù)

這張圖,主要講解關(guān)于cart這個(gè)單詞的所有的可能組合,按照常理,需要先考慮三個(gè)字母的排列,然后對(duì)三個(gè)字母進(jìn)行拆分,直到最后一個(gè)節(jié)點(diǎn),這個(gè)過(guò)程就類似于樹(shù) 到底什么是樹(shù)

什么是樹(shù)

樹(shù)是節(jié)點(diǎn)集合(A tree is a collection of nodes),

集合:集合是允許一個(gè)元素都沒(méi)有的集合,稱之為空集。

首先,集合是允許一個(gè)元素都沒(méi)有的集合,稱之為空集,那么書(shū)是不是也允許一個(gè)節(jié)點(diǎn)都沒(méi)有的呢,是的,一個(gè)節(jié)點(diǎn)都沒(méi)有的樹(shù),稱之為空樹(shù),如果不是空的,則會(huì)存在根節(jié)點(diǎn)r和零個(gè)或更多非空子樹(shù),T1,T2.。。Tk,他們的根由來(lái)自r的有向連接,什么叫有向邊,大致可以理解為箭頭。用圖的關(guān)系說(shuō)明樹(shù)的內(nèi)部關(guān)系

根節(jié)點(diǎn)(root)一棵樹(shù)只有一個(gè)跟節(jié)點(diǎn),所有的節(jié)點(diǎn)都在該節(jié)點(diǎn)的下面,嘗試把圖倒過(guò)來(lái)看,可以看成一個(gè)我們?nèi)粘R?jiàn)到的數(shù)的根部,在這里顯然字母A就是這顆樹(shù)的根節(jié)點(diǎn)。

子節(jié)點(diǎn),父節(jié)點(diǎn),一個(gè)節(jié)點(diǎn),它對(duì)應(yīng)的下面有連這的節(jié)點(diǎn),那么被連著的節(jié)點(diǎn)就是這個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),也叫做孩子,那么這個(gè)節(jié)點(diǎn)叫做被連接的節(jié)點(diǎn)的父親,看圖,B被A連這,所以B是A的一個(gè)孩子,同理,CDE等等這一行都是A的孩子,同時(shí)F,它連這K L M 同時(shí)被A連這,那么F是A的一個(gè)孩子,同時(shí)又是K L M 的父親。

樹(shù)葉:樹(shù)葉就是那些沒(méi)有孩子的節(jié)點(diǎn),比如B,C,D等等,例如下圖的綠色部分。

兄弟: 按照我們的理解,同一個(gè)父母生的當(dāng)然是兄妹,如下圖所示,顏色相同的都是兄妹

路徑 我們同樣可以定義從父親到他孩子的路徑,下面的路徑,我們就取上圖的一部分,一個(gè)子樹(shù),作為例子

比如,A->O的路徑為A->E->J->O它的長(zhǎng)度為3,實(shí)際為它的邊數(shù),圖中紅色的部分。

節(jié)點(diǎn)的深度:節(jié)點(diǎn)的深度指的是節(jié)點(diǎn)到樹(shù)根的長(zhǎng)度,看下圖,我們可以輕易的知道,j節(jié)點(diǎn)的深度為2,可以理解為 A-> E -> J 邊長(zhǎng)為2.顯然,此時(shí)根節(jié)點(diǎn)的深度為0.

節(jié)點(diǎn)的高度:高度是從節(jié)點(diǎn)到葉子的最長(zhǎng)路徑,比如節(jié)點(diǎn)F的高度為1,顯然所有葉子節(jié)點(diǎn)高度為0.

樹(shù)的高度,樹(shù)的高度是跟的高度,顯然在這圖中,樹(shù)的高度為3,A->O

樹(shù)的特點(diǎn)

按照正常的邏輯,一個(gè)人不能同時(shí)有兩個(gè)父親,所以樹(shù)也一樣,下圖的兩個(gè)就解釋了這個(gè)問(wèn)題

一顆正常的樹(shù),它的樹(shù)枝是不會(huì)長(zhǎng)成一個(gè)圓的,所以,樹(shù)中,是不可能出現(xiàn)環(huán)形的。圖中,紅色箭頭構(gòu)成了一個(gè)環(huán),所以都不是一顆樹(shù)。

樹(shù)的存儲(chǔ)結(jié)構(gòu)

樹(shù)的存儲(chǔ)結(jié)構(gòu)有三種,分別為,雙親表示法,孩子表示法,孩子兄弟表示法。

雙親表示法

假設(shè)一組連續(xù)空間保存著樹(shù)的特點(diǎn),同時(shí)在每個(gè)節(jié)點(diǎn)中,附帶一個(gè)指示器表示雙親節(jié)點(diǎn)中鏈表的為位置,也就是說(shuō),每個(gè)節(jié)點(diǎn)除了知道自己是誰(shuí)以外,還知道他的雙親在哪里。

其中data是數(shù)據(jù)域,存儲(chǔ)結(jié)點(diǎn)的數(shù)據(jù)信息。而parent是指針域,存儲(chǔ)該結(jié)點(diǎn)的雙親在數(shù)組中的下標(biāo)。

//樹(shù)的雙親表示法結(jié)點(diǎn)結(jié)構(gòu)定義
#define MAX_TRUE_SIZE 100
typedef int TElemType //樹(shù)結(jié)點(diǎn)的數(shù)據(jù)類型

//結(jié)點(diǎn)結(jié)構(gòu)
typedef struct PTNode   
{
	TElemType data;  //結(jié)點(diǎn)數(shù)據(jù)
	int parent;   	//雙親位置
}PTNode

//樹(shù)結(jié)構(gòu)
typedef struct
{
	PTNode nodes[MAX_TRUE_SIZE];  //結(jié)點(diǎn)數(shù)組
	int r,n     //根的位置和結(jié)點(diǎn)數(shù)
}PTree

有了這樣的數(shù)據(jù)結(jié)構(gòu)就可以來(lái)實(shí)現(xiàn)雙親表示法。由于根結(jié)點(diǎn)是沒(méi)有雙親的,所以我們約定根結(jié)點(diǎn)的位置域設(shè)置為-1,這也就意味著,我們所有的結(jié)點(diǎn)都存有他雙親的位置。如圖1-2中的樹(shù)結(jié)構(gòu)和表1-3中的樹(shù)雙親表示。

這樣的存儲(chǔ)結(jié)構(gòu),我們可以根據(jù)結(jié)點(diǎn)的parent’指針很容易找到他的雙親結(jié)點(diǎn),時(shí)間復(fù)雜度為O(1),直到parent為-1時(shí),表示找到了樹(shù)結(jié)點(diǎn)的根

孩子表示法

換一種完全不同的考慮方法,由于樹(shù)中每個(gè)結(jié)點(diǎn)可能有多棵子樹(shù),可以考慮用多重鏈表。每個(gè)結(jié)點(diǎn)有多個(gè)指針域,其中每個(gè)指針指向一顆子樹(shù)的根結(jié)點(diǎn),我們把這種方法叫做多重鏈表的表示方法。不過(guò),樹(shù)的每個(gè)結(jié)點(diǎn)的度,也就是他的孩子個(gè)數(shù)是不同的,所以設(shè)計(jì)兩種方法:

方案一

指針域的個(gè)數(shù)就等于樹(shù)的度,樹(shù)的度就是樹(shù)各個(gè)結(jié)點(diǎn)度的最大值。其結(jié)構(gòu)如圖

其中data是數(shù)據(jù)域,child1到childd是指針域,用來(lái)指向該結(jié)點(diǎn)的孩子結(jié)點(diǎn)。對(duì)于圖1-1來(lái)說(shuō),樹(shù)的度是3,所以我們指針域個(gè)數(shù)就是3,

方案二

每個(gè)結(jié)點(diǎn)指針域的個(gè)數(shù)等于該結(jié)點(diǎn)的度,我們專門取一個(gè)位置來(lái)存儲(chǔ)結(jié)點(diǎn)指針的個(gè)數(shù)。

data為指針域,degree為度域,也就是存儲(chǔ)該結(jié)點(diǎn)的孩子結(jié)點(diǎn)的個(gè)數(shù)

這就是我們要說(shuō)的孩子表示法,把每個(gè)結(jié)點(diǎn)的孩子都排列起來(lái),以單鏈表為存儲(chǔ)結(jié)構(gòu),則n個(gè)結(jié)點(diǎn)有n個(gè)孩子鏈表,如果是葉子結(jié)點(diǎn)則此單鏈表為空。然后n個(gè)頭指針又組成一個(gè)線性表,采用順序存儲(chǔ)結(jié)構(gòu),存放進(jìn)一個(gè)一維數(shù)組,

為此,設(shè)計(jì)兩種存儲(chǔ)結(jié)構(gòu),一個(gè)是孩子鏈表的孩子結(jié)點(diǎn),

child是數(shù)據(jù)域,用來(lái)存儲(chǔ)某個(gè)結(jié)點(diǎn)在表頭數(shù)組中的下標(biāo)。next是指針域,用來(lái)存儲(chǔ)指向結(jié)點(diǎn)的下一個(gè)孩子結(jié)點(diǎn)的指針。另一個(gè)是表頭數(shù)組的表頭結(jié)點(diǎn)。

data是數(shù)據(jù)域,存儲(chǔ)某結(jié)點(diǎn)的數(shù)據(jù)信息,firstchild是頭指針域,存儲(chǔ)該結(jié)點(diǎn)的孩子鏈表的頭指針。

//樹(shù)的孩子表示法結(jié)構(gòu)定義
#define MAX_TRUE_SIZE 100
typedef struct CTNode  //孩子結(jié)點(diǎn)
{
	int child;
	struct CTNode *next;
}*ChildPtr;
//表頭結(jié)構(gòu)
typedef struct
{
	TElemType data;
	ChildPtr firstchild;
}CTBox;
//樹(shù)結(jié)構(gòu)
typedef struct
{
	CTBox nodes[MAX_TRUE_SIZE];  //結(jié)點(diǎn)數(shù)組
	int r,n;               //根的位置和結(jié)點(diǎn)數(shù)
}CTree

把把雙親表示法和孩子表示法綜合一下表示如下

這種表示法叫做雙親孩子表示法,應(yīng)該算是孩子表示法的改進(jìn)。

孩子兄弟表示法

任一棵樹(shù),它的結(jié)點(diǎn)的第一個(gè)孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此。我們?cè)O(shè)置兩個(gè)指針,分別指向該結(jié)點(diǎn)的第一個(gè)孩子和此結(jié)點(diǎn)的右兄弟。

data是數(shù)據(jù)域,fitstchild為指針域,存儲(chǔ)該結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn)的存儲(chǔ)地址,rightsib是指針域,存儲(chǔ)該結(jié)點(diǎn)的右兄弟結(jié)點(diǎn)的存儲(chǔ)位置。

//孩子兄弟表示法結(jié)構(gòu)定義
typedef struct CSDNode
{
	TElemType data;
	struct CSNode *firstchild,*rightsib;
}CSNode,*CSTree;

這種方法的示意圖如下所示

這種表示法,給查找某個(gè)結(jié)點(diǎn)的某個(gè)孩子帶來(lái)了方便,只需要通過(guò)firstchild找到此結(jié)點(diǎn)的長(zhǎng)子,然后在通過(guò)長(zhǎng)子結(jié)點(diǎn)的rightsib找到它的二弟,接著一直找下去,直到找到具體的孩子。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    看點(diǎn):投資方:宇樹(shù)科技或于科創(chuàng)板IPO 美媒:亞馬遜機(jī)器人數(shù)量接近人類員工 英偉達(dá)股價(jià)創(chuàng)新高

    給大家?guī)?lái)一些行業(yè)資訊: 投資方:宇樹(shù)科技或于科創(chuàng)板IPO 早在2025年的5月29日,宇樹(shù)科技就正式發(fā)布通知稱,因公司發(fā)展需要,杭州宇樹(shù)科技有限公司即日起名稱變更為“杭州宇樹(shù)科技股份
    的頭像 發(fā)表于 07-04 15:08 ?195次閱讀

    看點(diǎn):宇樹(shù)科技完成C輪融資 曝Meta洽談聘用Github前CEO 庫(kù)克透露今年秋天再來(lái)中國(guó)

    給大家?guī)?lái)一些業(yè)界資訊消息:比如備受關(guān)注的宇樹(shù)科技、蘋(píng)果、還有Meta。 宇樹(shù)科技完成C輪融資 近日,據(jù)媒體報(bào)道,宇樹(shù)科技完成了C輪融資,宇樹(shù)科技的C輪融資由中國(guó)移動(dòng)旗下基金、騰訊、錦
    的頭像 發(fā)表于 06-20 15:30 ?317次閱讀

    存儲(chǔ)芯片方案發(fā)力,率先適配宇樹(shù)、智元機(jī)器人

    的訓(xùn)練到邊緣AI的應(yīng)用,需要云端存儲(chǔ)到邊緣端分級(jí)存儲(chǔ)方案的支持。據(jù)稱,一臺(tái)人形機(jī)器人至少需要使用48片以上的各種類型存儲(chǔ)芯片。近期來(lái)看,多家存儲(chǔ)廠商已經(jīng)投入到人形機(jī)器人的
    的頭像 發(fā)表于 05-26 09:21 ?6008次閱讀

    白話理解RCC時(shí)鐘樹(shù)(可下載)

    時(shí)鐘就像是單片機(jī)的“心臟”,單片機(jī)正常工作離不開(kāi)時(shí)鐘的支持,下圖是我們單片機(jī)的時(shí)鐘樹(shù) ,它反映了單片機(jī)的時(shí)鐘關(guān)系。我們來(lái)詳細(xì)描述一下時(shí)鐘樹(shù)的工作原理。寄存器上電后有一個(gè)復(fù)位值,大家看我畫(huà)紅線的這個(gè)
    發(fā)表于 03-27 13:50 ?0次下載

    樹(shù)科技攜兩款機(jī)器人亮相2025GDC

    在人工成本上升的大背景下機(jī)器人一直被看好,機(jī)器人技術(shù)一旦成熟可直接用于非常多的應(yīng)用場(chǎng)景上。多有業(yè)界分析師認(rèn)為,2024年是國(guó)內(nèi)外人形機(jī)器人原型機(jī)的發(fā)布大年,而2025年在具身智能、DeepSeek
    的頭像 發(fā)表于 02-23 15:47 ?1139次閱讀

    【技術(shù)分享】迅為RK3568開(kāi)發(fā)板使用TFTP加載內(nèi)核設(shè)備樹(shù)

    【技術(shù)分享】迅為RK3568開(kāi)發(fā)板使用TFTP加載內(nèi)核設(shè)備樹(shù)
    的頭像 發(fā)表于 02-21 14:04 ?697次閱讀
    【技術(shù)分享】迅為RK3568開(kāi)發(fā)板使用TFTP加載內(nèi)核設(shè)備<b class='flag-5'>樹(shù)</b>

    求解答,設(shè)備樹(shù)問(wèn)題

    請(qǐng)問(wèn),rk3588j要再提取一個(gè)USB3.0接口設(shè)備樹(shù)怎么改
    發(fā)表于 02-20 11:22

    對(duì)象存儲(chǔ)是什么結(jié)構(gòu)類型?

    對(duì)象存儲(chǔ)屬于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)架構(gòu),采用扁平化命名空間結(jié)構(gòu)。其核心通過(guò)唯一標(biāo)識(shí)符(ObjectID)定位數(shù)據(jù)對(duì)象,突破傳統(tǒng)文件系統(tǒng)的層級(jí)目錄限制,形成"桶-對(duì)象"兩級(jí)邏輯模型。數(shù)據(jù)以獨(dú)立
    的頭像 發(fā)表于 02-10 11:14 ?326次閱讀

    樹(shù)科技在物聯(lián)網(wǎng)方面

    樹(shù)科技在物聯(lián)網(wǎng)領(lǐng)域有多方面的涉及和發(fā)展,以下是一些具體信息: 傳感器技術(shù)合作 與傳感器公司合作:宇樹(shù)科技與一些傳感器技術(shù)公司有合作,例如奧比中光為宇樹(shù)機(jī)器狗提供激光雷達(dá)及結(jié)構(gòu)光傳感
    發(fā)表于 02-04 06:48

    使用TFTP加載內(nèi)核設(shè)備樹(shù)

    在嵌入式項(xiàng)目開(kāi)發(fā)中,為了適配新外設(shè)、調(diào)整硬件資源分配或修復(fù)驅(qū)動(dòng)問(wèn)題,需要頻繁修改設(shè)備樹(shù)和內(nèi)核。修改完成后,通常需要重新編譯生成鏡像,并將其燒錄到開(kāi)發(fā)板上進(jìn)行測(cè)試。然而,傳統(tǒng)的燒錄方式不僅需要連接物理接口,還可能因?yàn)殓R像體積較大而耗費(fèi)較長(zhǎng)時(shí)間,這在開(kāi)發(fā)周期緊張的情況下顯得尤為低效。
    的頭像 發(fā)表于 01-17 15:52 ?1422次閱讀
    使用TFTP加載內(nèi)核設(shè)備<b class='flag-5'>樹(shù)</b>

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹(shù)之設(shè)備樹(shù)組成和結(jié)構(gòu)

    的一項(xiàng)技能。設(shè)備樹(shù)的起源設(shè)備樹(shù)(Device Tree)是一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它由uboot傳遞給Linux內(nèi)核,被內(nèi)核解析,內(nèi)核根據(jù)設(shè)備樹(shù)中的硬件描述信息加載利用相應(yīng)驅(qū)動(dòng)資源
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹(shù)之設(shè)備樹(shù)組成和結(jié)構(gòu)

    的一項(xiàng)技能。設(shè)備樹(shù)的起源設(shè)備樹(shù)(Device Tree)是一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它由uboot傳遞給Linux內(nèi)核,被內(nèi)核解析,內(nèi)核根據(jù)設(shè)備樹(shù)中的硬件描述信息加載利用相應(yīng)驅(qū)動(dòng)資源
    發(fā)表于 01-07 09:16

    什么是默克爾樹(shù)(Merkle Tree)?如何計(jì)算默克爾根?

    01 默克爾樹(shù)的概念 默克爾樹(shù)(Merkle Tree)是一種特殊的二叉樹(shù),它的每個(gè)節(jié)點(diǎn)都存儲(chǔ)了一個(gè)數(shù)據(jù)塊的哈希值。哈希值是一種可以將任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為固定長(zhǎng)度的字符串的算法,它具有
    的頭像 發(fā)表于 09-30 18:22 ?2288次閱讀
    什么是默克爾<b class='flag-5'>樹(shù)</b>(Merkle Tree)?如何計(jì)算默克爾根?

    鐵電存儲(chǔ)器的結(jié)構(gòu)特點(diǎn)

    鐵電存儲(chǔ)器(Ferroelectric RAM, FRAM)是一種結(jié)合了RAM的快速讀寫(xiě)能力和非易失性存儲(chǔ)特性的存儲(chǔ)技術(shù)。其結(jié)構(gòu)特點(diǎn)主要體現(xiàn)在其獨(dú)特的材料構(gòu)成、工作原理、物理
    的頭像 發(fā)表于 09-29 15:18 ?1155次閱讀

    存儲(chǔ)器的層次結(jié)構(gòu)包括哪些

    存儲(chǔ)器的層次結(jié)構(gòu)是計(jì)算機(jī)系統(tǒng)中一個(gè)關(guān)鍵且復(fù)雜的部分,它決定了數(shù)據(jù)的存儲(chǔ)、訪問(wèn)和處理效率。存儲(chǔ)器的層次結(jié)構(gòu)主要包括多個(gè)層次,每個(gè)層次都有其特定
    的頭像 發(fā)表于 09-10 14:28 ?1552次閱讀