溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++樹與二叉樹實(shí)例分析

發(fā)布時(shí)間:2022-05-25 13:42:34 來源:億速云 閱讀:137 作者:iii 欄目:開發(fā)技術(shù)

這篇“C++樹與二叉樹實(shí)例分析”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++樹與二叉樹實(shí)例分析”文章吧。

樹的定義

Q:什么是樹

A:樹是一種 非線性 的數(shù)據(jù)結(jié)構(gòu),它是由 n ( n>=0 )個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹是因?yàn)樗雌饋硐褚豢玫箳斓臉?,也就是說它是根朝上,而葉朝下的。

Q:樹有什么特點(diǎn)

有一個(gè)特殊的結(jié)點(diǎn),稱為根結(jié)點(diǎn),根節(jié)點(diǎn)沒有前驅(qū)結(jié)點(diǎn)。

除根節(jié)點(diǎn)外,其余結(jié)點(diǎn)被分成M(M>0)個(gè)互不相交的集合T1、T2、&hellip;&hellip;、Tm,其中每一個(gè)集合Ti(1<= i <= m)又是一棵結(jié)構(gòu)與樹類似的子樹。每棵子樹的根結(jié)點(diǎn)有且只有一個(gè)前驅(qū),可以有0個(gè)或多個(gè)后繼。

樹是遞歸定義的

C++樹與二叉樹實(shí)例分析

對(duì)于樹的定義還需要強(qiáng)調(diào)兩點(diǎn):

當(dāng)n>0時(shí),根結(jié)點(diǎn)是唯一的,不可能存在多個(gè)根結(jié)點(diǎn)。數(shù)據(jù)結(jié)構(gòu)中的樹是只能有一個(gè)根結(jié)點(diǎn)。

當(dāng)m>0時(shí),子樹的個(gè)數(shù)沒有限制,但它們一定是互不相交的。像下圖中的結(jié)構(gòu)就不符合樹的定義,因?yàn)樗鼈兌加邢嘟坏淖訕洹?/p>

C++樹與二叉樹實(shí)例分析

C++樹與二叉樹實(shí)例分析

樹的名詞解釋

C++樹與二叉樹實(shí)例分析

節(jié)點(diǎn)的度:一個(gè)節(jié)點(diǎn)含有的子樹的個(gè)數(shù)稱為該節(jié)點(diǎn)的度; 如上圖:A的為3

葉節(jié)點(diǎn):度為0的節(jié)點(diǎn)稱為葉節(jié)點(diǎn); 如上圖:I,G,K,G,L,M節(jié)點(diǎn)為葉節(jié)點(diǎn)

非終端節(jié)點(diǎn)或分支節(jié)點(diǎn):度不為0的節(jié)點(diǎn); 如上圖:B、D、C、E、F等節(jié)點(diǎn)為分支節(jié)點(diǎn)

雙親節(jié)點(diǎn)或父節(jié)點(diǎn):若一個(gè)節(jié)點(diǎn)含有子節(jié)點(diǎn),則這個(gè)節(jié)點(diǎn)稱為其子節(jié)點(diǎn)的父節(jié)點(diǎn); 如上圖:A是B的父節(jié)點(diǎn)

孩子節(jié)點(diǎn)或子節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)含有的子樹的根節(jié)點(diǎn)稱為該節(jié)點(diǎn)的子節(jié)點(diǎn); 如上圖:B是A的孩子節(jié)點(diǎn)

兄弟節(jié)點(diǎn):具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)互稱為兄弟節(jié)點(diǎn); 如上圖:B、C是兄弟節(jié)點(diǎn)

樹的度:一棵樹中,最大的節(jié)點(diǎn)的度稱為樹的度; 如上圖:樹的度為3

節(jié)點(diǎn)的層次:從根開始定義起,根為第1層,根的子節(jié)點(diǎn)為第2層,以此類推

樹的高度或深度:樹中節(jié)點(diǎn)的最大層次; 如上圖:樹的高度為4

節(jié)點(diǎn)的祖先:從根到該節(jié)點(diǎn)所經(jīng)分支上的所有節(jié)點(diǎn);如上圖:A是所有節(jié)點(diǎn)的祖先

子孫:以某節(jié)點(diǎn)為根的子樹中任一節(jié)點(diǎn)都稱為該節(jié)點(diǎn)的子孫。如上圖:所有節(jié)點(diǎn)都是A的子孫

森林:由m棵互不相交的樹的集合稱為森林

樹的表示

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

說到存儲(chǔ)結(jié)構(gòu),自然就會(huì)想到我們前面講過的順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)兩種結(jié)構(gòu)。

順序存儲(chǔ)結(jié)構(gòu):樹中某個(gè)結(jié)點(diǎn)的孩子可以有多個(gè),若將樹中所有結(jié)點(diǎn)存儲(chǔ)到數(shù)組中,結(jié)點(diǎn)的存儲(chǔ)位置無法直接反應(yīng)其邏輯關(guān)系,因此:簡(jiǎn)單的順序存儲(chǔ)結(jié)構(gòu)是不能滿足樹的實(shí)現(xiàn)要求的

鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn),完全可以實(shí)現(xiàn)對(duì)樹的存儲(chǔ)結(jié)構(gòu)的表示。

表示方式:實(shí)際中樹有很多種表示方式, 如:雙親表示法,孩子表示法、孩子兄弟表示法等等。我們這里就簡(jiǎn)單的了解其中最常用的孩子兄弟表示法。

代碼演示

typedef int DataType;
struct Node
{
    struct Node* _firstChild1;    // 第一個(gè)孩子結(jié)點(diǎn)
    struct Node* _pNextBrother;   // 指向其下一個(gè)兄弟結(jié)點(diǎn)
    DataType _data;               // 結(jié)點(diǎn)中的數(shù)據(jù)域
};

圖像演示

C++樹與二叉樹實(shí)例分析

二叉樹的概念及結(jié)構(gòu)

二叉樹的概念

Q:什么是二叉樹

A:二叉樹是 n 個(gè)結(jié)點(diǎn)的有限集合。該集合或者為空集(空二叉樹)或者由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的,分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。

Q:二叉樹有什么特點(diǎn)

每個(gè)結(jié)點(diǎn)最多有兩棵子樹,二叉樹不存在度大于2的結(jié)點(diǎn)。左子樹和右子樹是有順序的,次序不能任意顛倒。即使樹中某結(jié)點(diǎn)只有一棵子樹,也要區(qū)分左子樹還是右子樹。

Q:二叉樹有什么基本形式

空二叉樹只有一個(gè)根節(jié)點(diǎn)根節(jié)點(diǎn)只有左子樹根節(jié)點(diǎn)只有右子樹根節(jié)點(diǎn)既有左子樹又有右子樹

Q:特殊的二叉樹有哪些

(1)滿二叉樹:在一顆二叉樹中,如果所有分支結(jié)點(diǎn)都存在左子樹和右子樹,并且所有葉子都在同一層上,這樣的二叉樹稱為滿二叉樹。如果一個(gè)二叉樹的層數(shù)為K,且結(jié)點(diǎn)總數(shù)是(2^k) -1 ,則它就是滿二叉樹。

C++樹與二叉樹實(shí)例分析

(2)完全二叉樹:對(duì)于一顆具有 n 個(gè)結(jié)點(diǎn)的二叉樹按層序編號(hào),如果編號(hào)為i(1<=i<=n)的結(jié)點(diǎn)與同樣深度的滿二叉樹中編號(hào)為i的結(jié)點(diǎn)在二叉樹中的位置完全相同,則稱這棵二叉樹為完全二叉樹。滿二叉樹是一種特殊的完全二叉樹。

C++樹與二叉樹實(shí)例分析

二叉樹的性質(zhì)

性質(zhì)一:在二叉樹的第 i 層上至多有2^(i-1) 個(gè)結(jié)點(diǎn)。

性質(zhì)二:深度為 k 的二叉樹至多有2^(k)-1個(gè)結(jié)點(diǎn)。

性質(zhì)三:對(duì)任何一棵二叉樹, 如果度為0,其葉結(jié)點(diǎn)個(gè)數(shù)為 n0, 度為2的分支結(jié)點(diǎn)個(gè)數(shù)為 n2,則有n0=n2 + 1。

性質(zhì)四:具有 n 個(gè)結(jié)點(diǎn)的完全二叉樹的深度為

C++樹與二叉樹實(shí)例分析

性質(zhì)五:對(duì)于具有 n 個(gè)結(jié)點(diǎn)的完全二叉樹,如果按照從上至下從左至右的數(shù)組順序?qū)λ泄?jié)點(diǎn)從 0 開始編號(hào),則對(duì)于任意結(jié)點(diǎn) i 有:

如果 i=1,則結(jié)點(diǎn) i 是二叉樹的根,無雙親;如果 i>1,則其雙親是結(jié)點(diǎn) 1/2如果 2i>n,則結(jié)點(diǎn) i無左孩子;否則其左孩子是結(jié)點(diǎn)2i如果 2i<n,則結(jié)點(diǎn) i無右孩子;否則其右孩子是結(jié)點(diǎn)2i+1

二叉樹的存儲(chǔ)結(jié)構(gòu)

順序存儲(chǔ)結(jié)構(gòu)

順序結(jié)構(gòu)存儲(chǔ)就是使用數(shù)組來存儲(chǔ),一般使用數(shù)組只適合表示完全二叉樹。因?yàn)椴皇峭耆鏄鋾?huì)有空間的浪費(fèi)。而現(xiàn)實(shí)中使用中只有堆才會(huì)使用數(shù)組來存儲(chǔ),二叉樹順序存儲(chǔ)在物理上是一個(gè)數(shù)組,在邏輯上是一顆二叉樹。

C++樹與二叉樹實(shí)例分析

C++樹與二叉樹實(shí)例分析

鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

二叉樹每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為它分配一個(gè)數(shù)據(jù)域和兩個(gè)指針域是比較自然的想法,我們稱這樣的鏈表叫做二叉鏈表。結(jié)點(diǎn)結(jié)構(gòu)如圖:

C++樹與二叉樹實(shí)例分析

C++樹與二叉樹實(shí)例分析

代碼演示

typedef int BTDataType;
struct BinaryTreeNode
{
    struct BinTreeNode* _pLeft;       // 指向當(dāng)前節(jié)點(diǎn)左孩子
    struct BinTreeNode* _pRight;      // 指向當(dāng)前節(jié)點(diǎn)右孩子
    BTDataType _data;                 // 當(dāng)前節(jié)點(diǎn)值域
}

以上就是關(guān)于“C++樹與二叉樹實(shí)例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI