【算法•日更•第四十五期】静态二叉排序树(建立)

蹲街弑〆低调 提交于 2019-11-27 15:35:47

▎前言

  小编虽然已经会了二叉排序树,但是却不明白静态二叉排序树和二叉排序树有什么关系。

  结合平衡二叉排序树(例如:红黑树)食用本篇博客,效果更佳哦~

  传送门(同时也内含二叉排序树的相关知识)

▎静态二叉排序树

『引入』

  这个东西要从线段树说起,别问我为什么扯这么远

  戳这里快速上手线段树

  不得不说,线段树是个好东西,每次都会把一个区间劈成左右两半,运用了分治的思想。

  但是线段树更多的是用来处理区间类的问题,在遇到数据点统计问题的时候,也能算出来,不过多保留了一下一些冗余的东西。

  比如说:线段树总是定义过多的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 }

▎静态二叉排序树的优点

  容易看出,静态二叉排序树及其相似满二叉树,有时就是!

  所以静态二叉排序树天生就是平衡树。  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!