数据结构复习(三)二叉排序树、平衡二叉树以及哈夫曼树

二叉排序树(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 ),如果是最坏的情况,就是插入时是按递增(减)的顺序,就会得到一个只有右(左)孩子的倾斜的单支树,那么查找长度为O(n)。

tips:二分查找是对有序顺序表。如果有序表是静态查找,用顺序表作为存储结构,用二分查找操作;如果是动态查找,应该选择二叉排序树。

平衡二叉树

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

LL平衡旋转(右单旋)

LL

RR平衡旋转(左单旋)

RR

LR平衡旋转(先左旋后右旋)

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

发布了5 篇原创文章 · 获赞 11 · 访问量 144

猜你喜欢

转载自blog.csdn.net/AndreyFC/article/details/105230709