• 二叉搜索树的顺序性


    ------------------siwuxie095

       

       

       

       

       

       

       

       

       

    二叉搜索树的顺序性

       

       

    二叉搜索树具有一定的顺序性,即 使用二叉搜索树可以回答很多

    元素之间的和顺序相关的问题,如下:

       

       

    1minimummaximum

       

    通过二叉搜索树可以非常容易地找到一组数据中最小的元素 minimum

    和最大的元素 maximum

       

       

       

       

       

    (2)predecessor successor

       

    通过二叉搜索树可以非常容易地找到一个元素的前驱 predecessor

    和后继 successor

       

       

       

       

       

    (3)floorceil

       

    通过二叉搜索树还可以找到一个元素的 floor 相应的值

    和 ceil 相应的值

       

    floor 和 ceil 与 predecessor 和 successor 的最大的一个区别就是:

    要想找到一个元素的前驱和后继,首先要保证这个元素真的存在

       

       

    如果要找一个元素的 floor 和 ceil:

       

    1)如果该元素存在,那么该元素的 floor 和 ceil 就是该元素本身

       

    2)如果该元素不存在,那么该元素的 floor 和 ceil 也是存在的,

    分别是最后一个比该元素小的值和第一个比该元素大的值,即

    接近的两个值。当然,也有可能该元素并没有 floor 或 ceil

       

       

       

       

       

    (4)rank select

       

    通过二叉搜索树还可以找到一个元素的排名 rank

    和找到某排名(如:第 100 名)的元素 select

       

       

    但遗憾的是一般的二叉搜索树并不能回答这两个问题,可做如下改动:

       

    对二叉搜索树的每一个节点多添加一个属性(域),该属性用于存储

    以当前节点为根的二叉搜索树一共有几个节点

       

       

       

    之后就可以利用二叉搜索树的性质:每个节点的键值都大于左孩子

    每个节点的键值都小于右孩子,来实现 rank 和 select

       

    注意:在给节点 Node 添加新属性后,编写 rank 和 select 这两个

    函数并不难,难的是要在之前实现的 insert 和 remove 这两个函数

    中同时维护新属性,使得当用户调用 rank 和 select 这两个函数时,

    能够得到正确的结果

       

       

       

       

       

    另外:

       

    一般的二叉搜索树,是不支持整棵树中存在重复元素的,但在

    有些情况下,需要二叉搜索树支持重复元素,该怎么做呢?

       

    一个最简单的方法,就是直接让这棵树可以存在重复元素,即

    把一个节点的左孩子,定义成是小于等于这个节点的元素,右

    孩子是大于这个节点的元素

       

    不过当存在大量重复元素时,这样做不够节省空间

       

       

       

    为此,依然可以通过更改节点 Node 的结构来解决,具体如下:

       

    对二叉搜索树的每一个节点多添加一个属性 count,该属性用于存储

    当前节点所代表的元素在二叉搜索树中的个数

       

       

       

    此时,构建出这样一棵二叉搜索树很容易,不过当每个节点都多出一个

    count 属性后,相应的 insert 和 remove,以及 rank 和 select 等等都

    要发生改变,以维护 count 属性

       

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    JS实现继承的几种方式
    跨平台APP----对Cordova,APPCan,DCloud,APICloud四大平台的分析
    cordova生成的android项目导入到Android studio 2.X 中遇到的问题解决方案
    链操作相关命令(包括启动,重启,删除)
    冷钱包和热钱包有什么区别?
    常用命令之git/linux
    centos安装git,go,shasum,okexchain环境
    iterm2的下载安装与配置
    使用jsdoc-to-markdown提前js文件的文档
    基于sphinx的文档(一)将md转为rst
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6984242.html
Copyright © 2020-2023  润新知