最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++超詳細(xì)講解樹與二叉樹

 更新時(shí)間:2022年05月25日 11:28:02   作者:錫蘭Ceylan_  
在之前的文章里,我們學(xué)習(xí)的一直是一對一的線性結(jié)構(gòu),可現(xiàn)實(shí)中,還有很多一對多的情況需要處理,所以我們需要研究這樣一種一對多的數(shù)據(jù)結(jié)構(gòu)——樹

樹的定義

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、……、Tm,其中每一個(gè)集合Ti(1<= i <= m)又是一棵結(jié)構(gòu)與樹類似的子樹。每棵子樹的根結(jié)點(diǎn)有且只有一個(gè)前驅(qū),可以有0個(gè)或多個(gè)后繼。

樹是遞歸定義的

對于樹的定義還需要強(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>

樹的名詞解釋

節(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棵互不相交的樹的集合稱為森林

樹的表示

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

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

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

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

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

代碼演示

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ù)域
};

圖像演示

二叉樹的概念及結(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 ,則它就是滿二叉樹。

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

二叉樹的性質(zhì)

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

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

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

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

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

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

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

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

鏈?zhǔn)酱鎯Y(jié)構(gòu)

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

代碼演示

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++超詳細(xì)講解樹與二叉樹的文章就介紹到這了,更多相關(guān)C++樹與二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言深入探究動(dòng)態(tài)規(guī)劃之線性DP

    C語言深入探究動(dòng)態(tài)規(guī)劃之線性DP

    線性動(dòng)態(tài)規(guī)劃,是較常見的一類動(dòng)態(tài)規(guī)劃問題,其是在線性結(jié)構(gòu)上進(jìn)行狀態(tài)轉(zhuǎn)移,這類問題不像背包問題、區(qū)間DP等有固定的模板,線性動(dòng)態(tài)規(guī)劃的目標(biāo)函數(shù)為特定變量的線性函數(shù),約束是這些變量的線性不等式或等式,目的是求目標(biāo)函數(shù)的最大值或最小值
    2022-04-04
  • C++實(shí)現(xiàn)正態(tài)隨機(jī)分布的方法

    C++實(shí)現(xiàn)正態(tài)隨機(jī)分布的方法

    本篇介紹了,使用c++實(shí)現(xiàn)正態(tài)隨機(jī)分布的實(shí)現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • 淺析C++中memset,memcpy,strcpy的區(qū)別

    淺析C++中memset,memcpy,strcpy的區(qū)別

    本篇文章是對C++中memset,memcpy,strcpy的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • C++11中std::function基礎(chǔ)用法詳解

    C++11中std::function基礎(chǔ)用法詳解

    std::function是C++11標(biāo)準(zhǔn)庫中提供的一種可調(diào)用對象的通用類型,它可以存儲任意可調(diào)用對象,本文就來和大家講講它的基礎(chǔ)用法,希望對大家有所幫助
    2023-04-04
  • 詳解C++設(shè)計(jì)模式編程中建造者模式的實(shí)現(xiàn)

    詳解C++設(shè)計(jì)模式編程中建造者模式的實(shí)現(xiàn)

    這篇文章主要介紹了C++設(shè)計(jì)模式編程中建造者模式的實(shí)現(xiàn),建造者模式將一個(gè)復(fù)雜對象的構(gòu)建于它的表現(xiàn)分離,可以減少代碼冗余,需要的朋友可以參考下
    2016-03-03
  • 淺析C++ 仿函數(shù)

    淺析C++ 仿函數(shù)

    這篇文章主要介紹了C++ 仿函數(shù)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • c語言_構(gòu)建一個(gè)靜態(tài)二叉樹實(shí)現(xiàn)方法

    c語言_構(gòu)建一個(gè)靜態(tài)二叉樹實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猚語言_構(gòu)建一個(gè)靜態(tài)二叉樹實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)

    C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(168.求Excel表列名稱),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言如何利用輾轉(zhuǎn)相除法求最大公約數(shù)

    C語言如何利用輾轉(zhuǎn)相除法求最大公約數(shù)

    這篇文章主要介紹了C語言如何利用輾轉(zhuǎn)相除法求最大公約數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++ const關(guān)鍵字分析詳解

    C++ const關(guān)鍵字分析詳解

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下
    2021-08-08

最新評論

汉中市| 沂源县| 剑河县| 云梦县| 八宿县| 和田市| 油尖旺区| 茌平县| 建始县| 云阳县| 永定县| 信宜市| 上高县| 永修县| 逊克县| 昌图县| 肥东县| 灵寿县| 台湾省| 鱼台县| 大田县| 元氏县| 余干县| 河津市| 彝良县| 南华县| 襄樊市| 大同县| 峨眉山市| 靖安县| 皋兰县| 内乡县| 通辽市| 庆元县| 崇州市| 靖远县| 海阳市| 璧山县| 崇礼县| 汝城县| 察哈|