基本資料結構 樹簡介

2021-09-25 00:17:05 字數 3539 閱讀 4030

一、什麼是樹

樹是乙個有限結點組成的集合。可以用遞迴的方式來定義一棵樹:樹可以是乙個空集,若非空,則一棵樹由乙個根(root)結點 r 以及 0 個或多個非空的(子)樹 t1、t2、t3、...,tk 組成,這些子樹中的每一棵的根都被來自根 r 的一條有向的邊(edge)所連線。每一棵子樹的根叫做根 r 的兒子(child),而 r 是每一棵子樹的根的父親(parent)

樹的幾個概念:

1)樹葉(leaf):從上述的遞迴定義可以知道,一棵樹是由 n 個結點和 n-1 條邊組成的集合。每個結點都可以有零個或任意多個兒子,沒有兒子的結點稱為樹葉(leaf);

2)兄弟(sibling):具有相同父親的結點稱為兄弟(sibling);

3)路徑(path):從結點 n1 到 nk 的路徑定義為結點 n1、n2、n3、...、nk 的乙個序列,使得對於 1 <= i  <= k,結點 ni 是 ni+1 的父親。這個路徑的長為該路徑上的邊的條數,即 k-1。從每乙個結點到它自己有一條長為 0 的路徑。在一棵樹中,從根到每個結點恰好存在一條路徑

4)深度(depth):對於任意結點 ni,ni 的深度為從根到 ni 的唯一路徑的長,根的深度為0;

5)高(height):對於任意結點 ni,ni 的高為從 ni 到一片樹葉的最長路徑的長,樹的高等於它的根的高(只有乙個根結點的樹的高度為0,空樹的高度為 -1);

6)結點的度:乙個結點的兒子的個數。

圖 1-1 樹

如圖所示,為一棵樹,其中,a是根結點;b、c、d、e、f 為 a 的兒子,a 為它們的父親;b 和 c有相同的父親,它們是兄弟(sibling);從結點 a 到結點 m 的路徑為 a、d、h、m;結點 b 的深度為1;結點 d 的高度為 3;整棵樹的高度為 4。

二、二叉樹

二叉樹是一棵樹,其中每個結點最多有兩個兒子,分別為左子結點和右子結點。二叉樹的平均深度是 o(√n)。

2.1 二叉樹的實現

因為一棵二叉樹的每個結點最多只能有兩個子結點,故而我們可以用指標直接指向它們。樹結點的宣告在結構上類似於雙鏈表的宣告,在宣告中,乙個結點由關鍵字(key)和兩個指向其他結點的指標(left 和 right)組成:

typedef int elementtype;

struct

treenode ;

typedef

struct treenode *ptrtonode;

typedef ptrtonode binarytree;

這段**宣告了乙個結構,該結構包含乙個 elementtype 型別的資料,用於儲存結點資料;乙個 left 指標,指向結點的左子樹;和乙個 right 指標,指向結點的右子樹。

2.2 二叉樹的遍歷

按一定的順序,依次訪問二叉樹中的所有結點的操作稱為遍歷。有三種方式可以對二叉樹進行遍歷,以下面這幅圖為例進行介紹:

圖 2-1 二叉樹

1)先序遍歷

先訪問根結點,然後遍歷左子樹,再遍歷右子樹。對圖 2-1 所示的二叉樹進行先序遍歷結果為:a-b-d-g-h-e-c-f-i-j。 先序遍歷一棵二叉樹的c語言實現如下:

/*

先序遍歷,遞迴實現

*/void preorderrecursion(binarytree t)

}

上述**用遞迴的方式實現了先序遍歷二叉樹。需要注意的是判斷條件,要時刻判斷二叉樹是否為空,這在遞迴中尤為重要。遞迴實現先序遍歷的**十分簡潔且易懂。但是,遞迴呼叫的空間複雜度較大,當輸入規模很大時,會占用相當多的記憶體,也容易造成堆疊的溢位。

可以使用非遞迴的方式來實現先序遍歷,大致思想如下:首先,將根結點儲存到乙個資料結構裡,然後訪問左子樹,待左子樹訪問完後,取出根結點,再訪問右子樹;每訪問乙個子樹之前,都將這棵子樹的根結點儲存,待需要訪問其右子樹時再取出。可以知道的是,先儲存進去的結點資料後取出,是乙個**先出結構,因此使用棧來儲存根結點的資料十分合適。

2)後序遍歷

先遍歷左子樹,再遍歷右子樹,最後訪問根結點。對圖 2-1 所示的二叉樹進行後序遍歷的結果為:g-h-d-e-b-i-j-f-c-a。

/*

後序遍歷,遞迴實現

*/void postorderrecursion(binarytree t)

}

3)中序遍歷

先遍歷左子樹,然後訪問根結點,再遍歷右子樹。對圖 2-1 所示的二叉樹進行中序遍歷的結果為:g-d-g-b-e-a-c-i-f-j。

/*

中序遍歷,遞迴實現

*/void inorderrecursion(binarytree t)

}

三、一些特殊的二叉樹3.1 滿二叉樹滿二叉樹是一棵深度為 k,且有 2^(k-1) 個結點的二叉樹,如下圖所示:

圖 2-2 滿二叉樹

這就是乙個滿二叉樹,可以看到,滿二叉樹的所有葉子都在同一層  ——  最後一層,非葉子結點的度一定為2。在同樣深度的二叉樹中,滿二叉樹的結點數是最多的,葉子數也是最多的。

3.2 完全二叉樹

完全二叉樹,除了最後一層外,其餘層都是滿的,且最後一層的葉子結點都幾種在樹的左邊。滿二叉樹就是完全二叉樹的乙個特例。如下圖:

圖 2-3 完全二叉樹

3.3 二叉查詢樹(二叉排序樹)

二叉查詢樹是二叉樹的一種,更適合於進行查詢操作。對於二叉查詢樹,樹中的每個結點 x 的左子樹中所有關鍵字的值小於 x 的關鍵字值,而它的右子樹中所有關鍵字值大於 x 的關鍵字值。這意味著,該樹的所有元素可以以某種統一的方式進行排序。二叉查詢樹的平均深度是 o(logn)。 

圖 2-4 二叉查詢樹

基本資料結構 樹(tree)

基本資料結構 樹 tree c 無論是鍊錶,棧還是佇列,它們都是線性結構的,每個節點的左邊最多乙個節點,右邊也最多乙個節點,對於大量的輸入資料,線性表的訪問時間太慢,不宜使用。這裡我要說一種非線性的資料結構,其大部分操作的執行時間平均為o logn 我們涉及到的這種資料結構叫做樹。在電腦科學中,樹是...

基本資料結構 樹(tree)

基本資料結構 樹 tree c無論是鍊錶,棧還是佇列,它們都是線性結構的,每個節點的左邊最多乙個節點,右邊也最多乙個節點,對於大量的輸入資料,線性表的訪問時間太慢,不宜使用。這裡我要說一種非線性的資料結構,其大部分操作的執行時間平均為o logn 我們涉及到的這種資料結構叫做樹。在電腦科學中,樹是非...

opencv基本資料結構

iplimage 首先介紹重要的成員變數 width和height表示了的尺寸。其次是depth和nchannels,depth是指畫素顏色的取值範圍,nchnannels為影象的通道,可以取1,2,3,4 origin變數定義了影象的原點,有兩個取值,分別是ipl origin bl和ipl or...