欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++超詳細講解樹與二叉樹

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

樹的定義

Q:什么是樹

A:樹是一種 非線性 的數(shù)據(jù)結構,它是由 n ( n>=0 )個有限結點組成一個具有層次關系的集合。把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

Q:樹有什么特點

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

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

樹是遞歸定義的

對于樹的定義還需要強調(diào)兩點:

當n>0時,根結點是唯一的,不可能存在多個根結點。數(shù)據(jù)結構中的樹是只能有一個根結點。

當m>0時,子樹的個數(shù)沒有限制,但它們一定是互不相交的。像下圖中的結構就不符合樹的定義,因為它們都有相交的子樹。

樹的名詞解釋

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

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

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

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

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

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

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

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

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

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

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

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

樹的表示

樹的存儲結構

說到存儲結構,自然就會想到我們前面講過的順序存儲和鏈式存儲兩種結構。

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

鏈式存儲結構:鏈式存儲結構的特點,完全可以實現(xiàn)對樹的存儲結構的表示。

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

代碼演示

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

圖像演示

二叉樹的概念及結構

二叉樹的概念

Q:什么是二叉樹

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

Q:二叉樹有什么特點

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

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

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

Q:特殊的二叉樹有哪些

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

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

二叉樹的性質(zhì)

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

性質(zhì)二:深度為 k 的二叉樹至多有2^(k)-1個結點。

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

性質(zhì)四:具有 n 個結點的完全二叉樹的深度為

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

如果 i=1,則結點 i 是二叉樹的根,無雙親;如果 i>1,則其雙親是結點 1/2

如果 2i>n,則結點 i無左孩子;否則其左孩子是結點2i

如果 2i<n,則結點 i無右孩子;否則其右孩子是結點2i+1

二叉樹的存儲結構

順序存儲結構

順序結構存儲就是使用數(shù)組來存儲,一般使用數(shù)組只適合表示完全二叉樹。因為不是完全二叉樹會有空間的浪費。而現(xiàn)實中使用中只有堆才會使用數(shù)組來存儲,二叉樹順序存儲在物理上是一個數(shù)組,在邏輯上是一顆二叉樹。

鏈式存儲結構

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

代碼演示

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

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

相關文章

  • 進程間通信之深入消息隊列的詳解

    進程間通信之深入消息隊列的詳解

    本篇文章是對消息隊列的應用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)簡單的HTTP服務器

    C++實現(xiàn)簡單的HTTP服務器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單的HTTP服務器的相關資料,感興趣的朋友可以參考下
    2016-05-05
  • C語言深入講解函數(shù)參數(shù)的使用

    C語言深入講解函數(shù)參數(shù)的使用

    函數(shù)的參數(shù)分為形參和實參兩種。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實參出現(xiàn)在主調(diào)函數(shù)中,進入被調(diào)函數(shù)后,實參變量也不能使用
    2022-04-04
  • 學習C和C++的9點經(jīng)驗總結

    學習C和C++的9點經(jīng)驗總結

    本文給大家總結了一下我們在學習C和C++的時候的一些經(jīng)驗和需要注意的事項,希望能給大家一些幫助,少走些彎路
    2015-12-12
  • C語言實現(xiàn)貪吃蛇小黑窗

    C語言實現(xiàn)貪吃蛇小黑窗

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇小黑窗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 用C實現(xiàn)添加和讀取配置文件函數(shù)

    用C實現(xiàn)添加和讀取配置文件函數(shù)

    本篇文章是對用C語言實現(xiàn)添加和讀取配置文件函數(shù)的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 基于Matlab實現(xiàn)繪制3D足球的示例代碼

    基于Matlab實現(xiàn)繪制3D足球的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Matlab實現(xiàn)繪制3D足球,文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-11-11
  • C++中封裝與信息隱藏的詳解及其作用介紹

    C++中封裝與信息隱藏的詳解及其作用介紹

    這篇文章主要介紹了C++中封裝與信息隱藏的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++設計模式之享元模式

    C++設計模式之享元模式

    這篇文章主要介紹了C++設計模式之享元模式,本文講解了什么是享元模式、享元模式代碼實例、享元模式的優(yōu)點等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 深入解析C++程序中激發(fā)事件和COM中的事件處理

    深入解析C++程序中激發(fā)事件和COM中的事件處理

    這篇文章主要介紹了深入解析C++程序中激發(fā)事件和COM中的事件處理,是C++事件操作的基礎,需要的朋友可以參考下
    2016-01-01

最新評論