天天看點

樹、二叉樹、二叉查找樹、AVL樹、伸展樹、B-樹

目錄

1.一般的樹(tree)

定義:

實作:

樹的周遊:

2.二叉樹(binary tree)

定義:

實作:

應用:

3.查找樹--二叉查找樹(binary search tree)

定義:

操作:

4.AVL樹(Adelson-Velsky-Landis Tree )

定義:

單旋轉(single rotation):

雙旋轉(double rotation):

5.伸展樹(splay tree)

定義:

展開:

6.樹的周遊

7.B-樹(B-tree)

定義:

應用:

1.一般的樹(tree)

定義:

一棵樹是是N個節點和N-1條邊的集合,其中的一個節點叫做根。

任意節點的深度為從跟到該節點的唯一路徑的長。一棵樹的深度等于它的最深的樹葉的深度。

任意節點的高是從該節點到一片樹葉的最長路徑的長。一棵樹的高等于它的根的高。樹的深度等于樹的高。

實作:

每個節點除資料外,有一個指針指向該節點的第一個兒子,另一個指針指向該節點的下一個兄弟。

typedef struct ThreeNode *PtrToNode;
struct TreeNode
{
	ElementType Element;
	PtrToNode FirstChild;
	PtrToNode NextSibling;
}
           

樹的周遊:

先序周遊(preorder traversal):先處理根節點,然後處理左右兒子。(使用:作業系統的目錄結構)

中序周遊(Inorder traversal):先處理左兒子,在處理根節點,最後處理右兒子。(使用:計算表達式樹)

後續周遊(postorder traversal):先處理左右左右兒子,然後處理根節點。(使用:計算檔案目錄的大小)

注:先序,中序,後續中的先、中、後是對于根而言的。

2.二叉樹(binary tree)

定義:

二叉樹是一棵樹,其中每個節點都不能有多于兩個的兒子。

實作:

節點由資料,和兩個指向左右兒子的指針構成。

typedef struct ThreeNode *PtrToNode;
typedef struct ThreeNode *Tree;

struct TreeNode
{
	ElementType Element;
	Tree Left;
	Tree Right;
}
           

應用:

表達式樹:樹葉是操作數(常量和變量),其他節點是操作符(+-*/)。

3.查找樹--二叉查找樹(binary search tree)

定義:

對于樹中的每個節點X,它的左子樹中所有關鍵字小于X的關鍵字,它的右子樹中所有關鍵字大于X的關鍵字。

操作:

MakeEmpty()

Find()

FindMin()

FindMax()

Insert()

Delete()

二叉查找樹,任意節點的期望深度為O(logN)

上述操作的平均運作時間都是O(logN)

4.AVL樹(Adelson-Velsky-Landis Tree )

定義:

AVL樹是帶有平衡條件的二叉查找樹,其每個節點的左子樹和右子樹的高度最多差1。

單旋轉(single rotation):

對X節點的左兒子的左子樹進行一次插入;

對X節點的右兒子的右子樹進行一次插入。

雙旋轉(double rotation):

對X節點的左兒子的右子樹進行一次插入;(先右旋轉再左旋轉)

對X節點的右兒子的左子樹進行一次插入。(先左旋轉再右旋轉)

5.伸展樹(splay tree)

定義:

一種放棄平衡條件,允許樹有任意深度的自調整(self-adjusting)樹。

當一個節點被通路後,它就要經過一系列AVL樹的旋轉被放到根上。

它保證從空樹開始任意連續M次對樹的操作最多花費O(MlogN)時間。一棵伸展樹每次操作的攤還代價是O(logN)

展開:

  • 之字形(zig-zag):

     雙旋轉

  • 一字型(zig-zig):

    左右樹變換。

6.樹的周遊

  • 按照排序的順序列出所有的關鍵字(中序周遊):
void PrintTree(SearchTree T)
{
	if(T!=NULL)
	{
	PrintTree(T->Left);
	PrintElement(T->Element);
	PrintTree(T->Right);
	}
}
           
  • 計算一個節點的高度(後續周遊):
int Height(Tree T)
{
	if(T==NULL)
	   return -1;
	else
	    return 1+Max(Height(T->Left),Height(T->Right));   

}
           
  • 先序周遊:

利用節點深度标志每一個節點。

  • 層序周遊(level-order tracersal):

所有深度為D的節點要再深度為D+1的節點之前處理。(使用隊列實作)

7.B-樹(B-tree)

定義:

階為M的B-樹,

樹的根或者是一片樹葉,或者其兒子數再2和M之間。

除根外,所有非樹葉節點的兒子數在[M/2]和M之間。

所有的樹葉都在相同的深度上。

所有的資料存儲在樹葉上。

在每一個内部節點上皆含有指向該節點各兒子指針P1,P2.....PM

在每一個内部節點上皆含有代表子樹P1,P2.....PM中發現的最小關鍵字的值k1,k2......km

對于每一節點,其子樹P1中所有關鍵字都小于子樹P2的關鍵字,依次類推。

在非根數葉中關鍵字的個數也在[M/2]和M之間。

應用:

資料庫系統。

繼續閱讀