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


    ▎前言

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

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

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

    ▎静态二叉排序树

    『引入』

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

      戳这里快速上手线段树

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

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

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

    ▎静态二叉排序树的优点

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

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

  • 相关阅读:
    IS-IS协议的内容
    OSPF协议---进阶篇
    OSPF协议-summary-LSA(LSA-3)
    OSPF协议-外部路由(LSA-4和LSA-5)
    OSPF的特殊区域和其他特性
    BGP的反射器和联盟
    neo4j 初级使用笔记
    Flink窗口介绍及应用
    HDFS之append数据到已存在文件中
    Random Projection在k-means的应用
  • 原文地址:https://www.cnblogs.com/TFLS-gzr/p/11368440.html
Copyright © 2020-2023  润新知