首页 > 其他分享 >二叉搜索树(BST,binary search tree)

二叉搜索树(BST,binary search tree)

时间:2023-08-16 17:14:45浏览次数:42  
标签:Node binary search right BST else Null data left

  对于静态查找可以用二分查找,将查找时间复杂度降到 log2 n 。其中,虽然数据存储在线性的结构里,但我们事先对数据进行了处理,在查找的顺序过程中运用到判定树这样的结构,将线性上的查找过程转变为了在类似树上面的查找过程,其查找的效率就是树的高度。但如果查找的集合不仅有查找还有删除新增的需求,而树具有良好的动态性,为什么不直接将数据放在树里呢,我们所称的二叉搜索树可以很好的解决该问题。

  

  一棵不为空的二叉搜索树具有以下性质:

       1.非空的左子树的所有键值小于根的键值

  2.非空的右子树的所有键值大于根的键值

  3.左右子树都是二叉搜索树

一、树的结构

1 struct Node{
2     int data;
3     Node* left;
4     Node* right;
5 };
Node* Null; //自定义空指针(个人习惯)

 二、利用非递归函数进行查找

 1 Node* Find(int x,Node* u)
 2 {
 3     while( u!=Null )
 4     {
 5         if( u->data > x ) u=u->right;
 6         else if( u->data < x ) u=u->left;
 7         else return u;
 8     }
 9     return Null;
10 }

三、查找最大、最小值

1 Node* FindMax( Node* u )   
2 {
3     //一直到最右边就是最大值
4     while( u!=Null && u->right!=Null )
5     {
6         u=u->right;
7     }
8     return u;
9 }
 1 Node* FindMin( Node* u ) 
 2 {
 3     //一直到最左边就是最小值
 4     while( u!=Null && u->left!=Null )
 5     {
 6         u=u->left;
 7     }
 8     return u;
 9     
10 }

四、插入

 1 Node* Insert( int x,Node* u )
 2 {
 3     if( u==Null )
 4     {
 5         u=(Node*)malloc(sizeof(struct Node)); //c++记得强制类型转换
 6         u->data=x;
 7         u->left=u->right=Null;
 8     }
 9     else
10     {
11         if( x > u->data ) u->right=Insert( x,u->right );
12         else if( x < u->data ) u->left=Insert( x,u->left );
13     }
14     return u;
15 }

五、删除

 1 Node* Delete( int x,Node* u )
 2 {
 3     if( x > u->data ) u->right=Delete( x,u->right );
 4     else if( x < u->data ) u->left=Delete( x,u->left );
 5     else
 6     {
 7         if( u->left!=Null && u->right!=Null )
 8         {
 9             Node* temp=FindMin( u->right );
10             u->right=Delete( temp->data,u->right );
11             u->data=temp->data;
12         }else
13         {
14             Node* temp=u;
15             if( u->left!=Null ) u=u->left;
16             else u=u->right;
17             free(temp);
18         }
19 
20     }
21     return u;
22 }

 

标签:Node,binary,search,right,BST,else,Null,data,left
From: https://www.cnblogs.com/ajn-zuiniu/p/17627480.html

相关文章

  • elasticsearch中的数据类型:flattened和join
    flattened:比如你有一个字段的值是一个json,这个json里面又有很多字段,你又不想一个一个的定义这些字段到mapping,就可以用flattened直接动手:创建索引:PUTperson{"mappings":{"properties":{"patient_name":{"type":"text"},&......
  • Elasticsearch 保姆级入门篇
    Elasticsearch是一个分布式的、面向生产规模工作负载优化的搜索引擎。Kibana可以将Elasticsearch中的数据转化为直观的图表、图形和仪表盘。这篇文章,您将学习本地安装Elasticsearch和Kibana,以及使用开发工具/JavaSDK创建索引和搜索数据。1本地安装1.1创建网络我......
  • Linux的ElasticSearch安装部署
    简介全文搜索属于最常见的需求,开源的Elasticsearch(以下简称es)是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、StackOverflow、Github都采用它。Elasticsearch简称es,在企业内同样是一款应用非常广泛的搜索引擎服务。很多服务中的搜索功能,都......
  • ElasticSearch置顶方案
    最近系统有个需求,希望工作流的审批人被催办后就要置顶在最前面,工作流列表我是用es的,一开始想用pinned实现,但用pinned的话,每页都会置顶在前面,我的需求只是想让他优先排在前面,翻页后正常显示后面找到这个,通过把匹配到数据的分数提高,然后用sort进行排序,就能实现我的需求了GETwf......
  • Programming abstractions in C阅读笔记p111-p113: boilerplate
    《ProgrammingAbstractionsInC》学习第47天,p111-p113,总结如下:一、技术总结1.boilerplate/**File:random.h*Version:1.0*LastmodifiedonFriJul2216:44:361994byeroberts*-----------------------------------------------------*Thisinterfacepr......
  • Programming abstractions in C阅读笔记p111-p113: boilerplate
    《ProgrammingAbstractionsInC》学习第47天,p111-p113,总结如下:一、技术总结1.boilerplate/**File:random.h*Version:1.0*LastmodifiedonFriJul2216:44:361994byeroberts*-----------------------------------------------------*Thisinterfaceprovi......
  • 学好Elasticsearch系列-索引的批量操作
    本文已收录至Github,推荐阅读......
  • 学好Elasticsearch系列-脚本查询
    本文已收录至Github,推荐阅读......
  • 使用Logstash同步Mysql到Easysearch
    从Mysql同步数据到ES有多种方案,这次我们使用ELK技术栈中的Logstash来将数据从Mysql同步到Easysearch。方案前提Mysql表记录必须有主键,比如id字段。通过该字段,可将Easysearch索引数据与Mysql表数据形成一对一映射关系,支持修改。Mysql表记录必须有时间字段,......
  • 使用Logstash同步Mysql到Easysearch
    从Mysql同步数据到ES有多种方案,这次我们使用ELK技术栈中的Logstash来将数据从Mysql同步到Easysearch。方案前提Mysql表记录必须有主键,比如id字段。通过该字段,可将Easysearch索引数据与Mysql表数据形成一对一映射关系,支持修改。Mysql表记录必须有时间字段,以支持......