數據結構複習(三)二叉排序樹、平衡二叉樹以及哈夫曼樹

二叉排序樹(BST)

簡單來說,二叉排序樹是符合:左子樹結點<根節點<右子樹結點這麼一個邏輯。如果按照中序遍歷對二叉排序樹進行一次遍歷,那麼一定得到一個遞增序列。
二叉排序樹
二叉排序樹的插入過程也就是一個比較過程,每新插入一個元素,都要進行比較。如果關鍵字小於根節點,則插入到左子樹,反之,插入到右子樹。注意:插入的結點一定是新添加的葉子結點

王道書上的插入算法是用的遞歸算法:

int BST_Insert(BiTree &T,KeyType k)
{
	if(T==NULL)  //原樹爲空
	{
		T=(BiTree*)malloc(sizeof(BSTNode));
		T->key=k;
		T->lchild=T->rchild=NULL;
		return 1; //插入成功
	}
	else if(k==T->key) //樹種存在相同關鍵字結點,插入失敗
		return 0;
	else if(k<T->key) //插入左子樹
		return BST_Insert(T->lchild,k);
	else  //插入右子樹
		return BST_Insert(T->rchild,k);
}

我在裏數據結構複習(一)裏用的是非遞歸的方法,看起來比較愚蠢哈哈哈,不過意思是一樣噠~

再來說說二叉排序樹的查找效率。如果是平衡二叉樹,那麼它的平均查找長度爲O(log2n\log_2n),如果是最壞的情況,就是插入時是按遞增(減)的順序,就會得到一個只有右(左)孩子的傾斜的單支樹,那麼查找長度爲O(n)。

tips:二分查找是對有序順序表。如果有序表是靜態查找,用順序表作爲存儲結構,用二分查找操作;如果是動態查找,應該選擇二叉排序樹。

平衡二叉樹

|平衡因子| = |左子樹高度-右子樹高度| ≤ 1

LL平衡旋轉(右單旋)

LL

RR平衡旋轉(左單旋)

RR

LR平衡旋轉(先左旋後右旋)

LR

RL平衡旋轉(先右旋後左旋)

在這裏插入圖片描述
舉個栗子~
插入(34,23,15,98,115,28,107)
例子

哈夫曼樹

也稱最優二叉樹,其帶權路徑長度(WPL)最小。

WPL

WPL=i=1nwili\displaystyle\sum_{i=1}^{n} w_il_i

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章