关于二叉查找树的一些事儿(bst详解)

Posted ztz11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于二叉查找树的一些事儿(bst详解)相关的知识,希望对你有一定的参考价值。

最近刚学了平衡树,然后突发奇想写几篇博客纪念一下,可能由于是刚学的缘故,还有点儿生疏,望大家海涵

说到平衡树,就不得不从基础说起,而基础,正是二叉查找树

什么是二叉查找树??

大家观察一下下面的这棵二叉树

技术分享图片

相信大家一眼就能发现,这棵树从左往右是递增的(也就是右儿子大于左儿子)

那么这样的一棵树有什么用呢?

就比如说图上的这个数列 12 10 15 6 13 19 2 8 14 22

如果你想找第n大的数,你明显需要冒泡或排序最坏O(n^2/2),O(nlogn);

如果数列在更改一下,那你每次都要跑这么多,电脑累死了

但如果你用上图这棵树,根据他(右儿子>自己>左儿子)的特性,可以在期望复杂度O(logn)的时间内查出一个数据

同时修改也变得简单,O(logn)的时间查找位置,O(1)的时间连边

如下图解释

这次我要插入7,我们从根节点开始

技术分享图片

很明显,根节点大于7,那么我把7下放到左儿子

技术分享图片

还是大,怎么办?继续下放到左儿子技术分享图片

 

 这次是小了,放右儿子

 技术分享图片

右儿子又大了,我们把他往左儿子上放

 但是,8这里没有左儿子

可以恭喜了,7终于找到了自己的位置,我们现在新建一个结点,连一条边,使他变为8的左儿子

技术分享图片

当然,有重复时也很好办,在该结点加一个数量标记,告诉他有几个即可

 插入的代码:

void add(int wz,int v)
{
	x[wz].size++;
	if(x[wz].val==v)
	{
		x[wz].cnt++;
		return;
	}
	if(x[wz].val>v)
	{
		if(x[wz].ls!=0)
		{
			add(x[wz].ls,v); 
		} 
		else
		{
			bnt++;
			x[bnt].val=v;
			x[bnt].size=1;
			x[bnt].cnt=1;
			x[wz].ls=bnt;
		}
	}
	else
	{
		if(x[wz].rs!=0)
		{
			add(x[wz].rs,v);
		}
		else
		{
			bnt++;
			x[bnt].val=v;
			x[bnt].size=1;
			x[bnt].cnt=1;
			x[wz].rs=bnt;
		}
	}
}

  未完待续(其实是没来得及写完),如有问题欢迎指出

 

以上是关于关于二叉查找树的一些事儿(bst详解)的主要内容,如果未能解决你的问题,请参考以下文章

“中兴捧月”比赛之——二叉查找树(BST)树的最短路径Java求解

BST二叉树的二分查找

详解二叉查找树(BST)

Treap(树堆)详解

数据结构 - 从二叉搜索树说到AVL树之二叉搜索树的操作与详解(Java)

二叉搜索树的删除操作详解(BST)