书上实现:

二叉搜索数的特点:高效实现 插入一个数值,查询是否包含某个数值,删除某一个数值。

所有的节点都满足左子树上的所有节点都比自己的小,而右子树上的所有节点都比自己大的特点。

查询:如果当前数值等于根节点返回true,比根节点小,就往左儿子走,否则往右儿子走。

插入:按照查找数值的方法去找其所在位置,从根节点出发,往左右儿子中找到合适位置。

删除:需要删除的节点没有左儿子,那么就把右儿子提上去。

需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去

   以上两种情况都不符合的话,就把左儿子的子孙中最大的节点提到需要删除的节点上。

 1 #include <cstdio>
 2
 3 struct node {   //树
 4     int val;  //节点的值
 5     node *lch, *rch;  //左右儿子
 6 };
 7
 8 node *insert(node *p,int x) {
 9     if(p == NULL) {  //如果节点为空  并赋值为x
10         node *q = new node;
11         q->val = x;
12         q->lch = q->rch = NULL;
13         return q;
14     }
15     else {   //递归调用
16         if(x < p->val) p->lch = insert(p->lch,x);
17         else p->rch = insert(p->rch,x);
18         return p;
19     }
20 }
21
22 bool find(node *p, int x) {
23     if(p==NULL) return false;
24     else if(x == p->val) return true;
25     else if(x < p->val) return find(p->lch,x);
26     else return find(p->rch,x);
27 }
28
29 node *remove(node *p,int x) {
30     if(p==NULL) return NULL;  //如果树为空 返回NULL
31     else if(x < p->val) p->lch = remove(p->lch,x); //
32     else if(x > p->val) p->rch = remove(p->rch,x);
33     else if(p->lch==NULL) {
34         node *q=p->rch;
35         delete p;
36         return q;
37     }
38     else if(p->lch->rch == NULL) {
39         node *q = p->lch;
40         q->rch = p->rch;
41         delete p;
42         return q;
43     }
44     else {
45         node *q;
46         for(q = p->lch; q->rch->rch !=NULL; q = q->rch);
47         node *r = q->rch;
48         q->rch=r->lch;
49         r->lch=p->lch;
50         r->rch=p->rch;
51         delete p;
52         return r;
53     }
54     return p;
55 }
56
57 int main()
58 {
59     node *root =NULL;
60     root=insert(root,1);
61     root=insert(root,2);
62     root=insert(root,3);
63     root=insert(root,5);
64     root=insert(root,7);
65
66     root=remove(root,2);
67
68     bool flag=find(root,2);
69     bool flag1=find(root,7);
70     printf("%d %d\n",flag,flag1);
71     return 0;
72 }

set正是使用二叉搜索树维护集合的容器。

 1 #include <cstdio>
 2 #include <set>
 3 using namespace std;
 4
 5 int main() {
 6
 7     set<int> s;
 8
 9     s.insert(1);
10     s.insert(3);
11     s.insert(5);
12
13     set<int>::iterator it;
14
15     it=s.find(1);
16     if(it == s.end()) puts("not found");
17     else puts("found");
18
19     it=s.find(2);
20     if(it == s.end()) puts("not found");
21     else puts("find");
22
23     s.erase(3);
24     if(s.count(3)!=0) puts("found");
25     else puts("not found");
26
27     for(it = s.begin(); it != s.end(); it++) {
28         printf("%d\n",*it);
29     }
30     return 0;
31 }

map 是维护则是维护键和键对应值的容器。

 1 #include <cstdio>
 2 #include <map>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6
 7 int main() {
 8
 9     map<int, const char*>m;
10
11     m.insert(make_pair(1,"ONE"));
12     m.insert(make_pair(10,"THE"));
13
14     m.insert(make_pair(44,"HYNU"));
15     m[100]="hynuacm";
16
17     map<int,const char*>::iterator it;
18
19     it=m.find(1);
20     puts(it->second);
21     it=m.find(2);
22     if(it == m.end()) puts("not found");
23     else puts(it->second);
24
25     puts(m[10]);
26
27     m.erase(10);
28
29     for(it = m.begin(); it != m.end(); it++) {
30         printf("%d: %s\n",it->first,it->second);
31     }
32     return 0;
33 }

转载于:https://www.cnblogs.com/nowandforever/p/4480366.html

二叉搜索树的两种实现(数组模拟,STL)相关推荐

  1. php实现二叉搜索树,二叉搜索树有几种实现方式

    二叉搜索树有一种实现方式,就是用链表实现,而链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,且链表是由一系列结点组成,结点可以在运行时动态生成. ...

  2. Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

    669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...

  3. C++(第十三篇):二叉搜索树(二叉树进阶、二叉搜索树的结构、应用及模拟实现)

  4. C++---二叉搜索树

    目录 一.二叉搜索树的概念 二.二叉搜索树的操作 1.查找 2.插入 3.删除 三.二叉搜索树的实现 四.二叉搜索树的两种模型 1.K模型 2.KV模型 五.二叉搜索树性能分析 一.二叉搜索树的概念 ...

  5. laravel数组转换为字符串_LeetCode刷题实战108:将有序数组转换为二叉搜索树

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  6. 算法篇 - 二叉搜索树

    前言 在前端的工作当中,二叉搜索树不怎么常见,虽然没有快排.冒泡.去重.二分.希尔等算法常见,但是它的作用,在某些特定的场景下,是非常重要的. 目前es6的使用场景比较多,所以我准备能用es6的地方就 ...

  7. 二叉搜索树(BST)?平衡二叉树(AVL)?

    二叉搜索树:中序遍历序列是有序的. 二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树: 左子节点的值比父节点小 右子节点的值比父节点大 任意节点的左右字树也分别为二叉查找树 没有键值相 ...

  8. 模板:二叉搜索树平衡树

    文章目录 前言 二叉搜索树 代码 treap 代码 splay 开点 旋转 splay 插入 查找第k大元素 查找给定元素的排名 前驱&后继 删除 完整代码 练习总结 前言 终于开始学这个东西 ...

  9. 【数据结构与算法】二叉堆与二叉搜索树的区别

    问题描述 记得刚学习数据结构的时候,就容易混淆二叉堆和二叉搜索树,其实虽说堆也是一种完全二叉树,但二者差别还是挺大的,本文试做分析. 逻辑结构 二叉堆和二叉搜索树都是结点带权重,并在父子结点间满足某种 ...

  10. Golang Java 实现 【将有序数组装换为二叉搜索树】

    ​​​​​​​​​​​​​LeetCode 108道 .将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树. 高度平衡 二叉 ...

最新文章

  1. 余承东没有吹牛:华为首次超越三星,成为全球最大手机供应商
  2. 什么是推理统计(inferential statistics)?
  3. Ubuntu 下添加OpenERP command 快捷启动方式
  4. db设计专用excel_注塑模具设计与加工解决方案
  5. 难点—在引用数组元素时指针的运算
  6. 数据结构---BF字符串模式匹配
  7. LeetCode 2065. 最大化一张图中的路径价值(DFS)
  8. php树形数据结构是什么,数据结构 之 树
  9. Java 数组转 List 的三种方式及对比
  10. Linux学习笔记7-磁盘管理
  11. 苹果电脑如何修改环境变量
  12. 螺旋矩阵的上下左右四指针解法
  13. 手动搭建Kubernetes1.8高可用集群(6)calico
  14. 保密管理规定 涉密计算机销毁,涉密文件保密制度
  15. 【Hulu独家面试宝典】助你决胜校招技术面
  16. python涨工资问题_7-45 jmu-python-涨工资 (10 分)
  17. 1.4 Kronecker积
  18. LoadLibrary failed with error 1114:动态链接库(DLL)初始化例程失败 解决方法
  19. 介绍两款常用的“图表统计图的插件
  20. 人口密度可视化_使用GeoPandas可视化菲律宾的人口密度

热门文章

  1. 对携程处理结果表示满意
  2. 南宁公交有两个应用付费通道,互不通用
  3. 根据眼睛焦点分级绘制3D效果的设想
  4. SHELL中如何对一个变量进行算术操作(加减)
  5. 遇到一次传导干扰的怪事
  6. mysql所选路径已经存在_Win10环境下安装压缩包版本MySQL-8.0.13
  7. iis7 php 中文乱码,php输出文字乱码的解决方法
  8. c语言 如何调用void函数,在C中从main调用void*函数
  9. 台达a2_台达伺服ASDA-A2系列解决五轴CNC方案助力雕刻机行业换代升级
  10. java canvas数组_java数组