二叉排序樹(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(),如果是最壞的情況,就是插入時是按遞增(減)的順序,就會得到一個只有右(左)孩子的傾斜的單支樹,那麼查找長度爲O(n)。
tips:二分查找是對有序順序表。如果有序表是靜態查找,用順序表作爲存儲結構,用二分查找操作;如果是動態查找,應該選擇二叉排序樹。
平衡二叉樹
|平衡因子| = |左子樹高度-右子樹高度| ≤ 1
LL平衡旋轉(右單旋)
RR平衡旋轉(左單旋)
LR平衡旋轉(先左旋後右旋)
RL平衡旋轉(先右旋後左旋)
舉個栗子~
插入(34,23,15,98,115,28,107)
哈夫曼樹
也稱最優二叉樹,其帶權路徑長度(WPL)最小。
WPL
WPL=