▎前言
小编虽然已经会了二叉排序树,但是却不明白静态二叉排序树和二叉排序树有什么关系。
结合平衡二叉排序树(例如:红黑树)食用本篇博客,效果更佳哦~
传送门(同时也内含二叉排序树的相关知识)
▎静态二叉排序树
☞『引入』
这个东西要从线段树说起,别问我为什么扯这么远。
不得不说,线段树是个好东西,每次都会把一个区间劈成左右两半,运用了分治的思想。
但是线段树更多的是用来处理区间类的问题,在遇到数据点统计问题的时候,也能算出来,不过多保留了一下一些冗余的东西。
比如说:线段树总是定义过多的l,r,mid指针来指向区间,这就是冗余信息;
再比如说:线段树的节点是用来存储区间的,而在处理点的问题时,是不需要的,这就是冗余信息。
还有:在处理点时,线段树的区间一分为二,是通过一个分割点的,只要保留这个分割点就可以了。
像这样的冗余信息不止这些,但是如果我们换成二叉排序树就不同了。
☞『定义』
个人认为二叉排序树和静态二叉排序树在定义上没有区别。
☞『特点』
用例子来说吧:
比如说现在有这样一组数据:3,6,9,2,5,4,1。
先明确一下位置关系:
假设当前节点为i,那么左子树编号为i×2,右子树编号为i×2+1,所以我们用数组进行存储的时候就是按照这个规律来存储的。
先创建一个映射X={1,2,3,4,5,6,9}(说白了就是排序一遍)。
接着用这个映射按照二叉排序树的性质开始填入:
发现规律了吗?1,2,3,4,5,6,9恰好是这棵树的中序遍历顺序。
也就是说静态二叉排序树插入点是靠中序遍历的,但是二叉排序树不一样,插入方式和搜索时很像。
▎静态二叉排序树的查找
这个很简单吧,直接上代码:
1 void build(int i) 2 { 3 if(i*2<=n) build(i*2); 4 tree[i]=x[++cnt]; 5 if(i*2+1<=n) build(i*2+1); 6 }
▎静态二叉排序树的优点
容易看出,静态二叉排序树及其相似满二叉树,有时就是!
所以静态二叉排序树天生就是平衡树。