二叉排序树(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( log 2 n \log_2n log2n),如果是最坏的情况,就是插入时是按递增(减)的顺序,就会得到一个只有右(左)孩子的倾斜的单支树,那么查找长度为O(n)。
tips:二分查找是对有序顺序表。如果有序表是静态查找,用顺序表作为存储结构,用二分查找操作;如果是动态查找,应该选择二叉排序树。
平衡二叉树
|平衡因子| = |左子树高度-右子树高度| ≤ 1
LL平衡旋转(右单旋)
RR平衡旋转(左单旋)
LR平衡旋转(先左旋后右旋)
RL平衡旋转(先右旋后左旋)
举个栗子~
插入(34,23,15,98,115,28,107)
哈夫曼树
也称最优二叉树,其带权路径长度(WPL)最小。
WPL
WPL= ∑ i = 1 n w i l i \displaystyle\sum_{i=1}^{n} w_il_i i=1∑nwili