二叉搜索树的两种实现(数组模拟,STL)
书上实现:
二叉搜索数的特点:高效实现 插入一个数值,查询是否包含某个数值,删除某一个数值。
所有的节点都满足左子树上的所有节点都比自己的小,而右子树上的所有节点都比自己大的特点。
查询:如果当前数值等于根节点返回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)相关推荐
- php实现二叉搜索树,二叉搜索树有几种实现方式
二叉搜索树有一种实现方式,就是用链表实现,而链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,且链表是由一系列结点组成,结点可以在运行时动态生成. ...
- Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树
669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...
- C++(第十三篇):二叉搜索树(二叉树进阶、二叉搜索树的结构、应用及模拟实现)
- C++---二叉搜索树
目录 一.二叉搜索树的概念 二.二叉搜索树的操作 1.查找 2.插入 3.删除 三.二叉搜索树的实现 四.二叉搜索树的两种模型 1.K模型 2.KV模型 五.二叉搜索树性能分析 一.二叉搜索树的概念 ...
- laravel数组转换为字符串_LeetCode刷题实战108:将有序数组转换为二叉搜索树
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- 算法篇 - 二叉搜索树
前言 在前端的工作当中,二叉搜索树不怎么常见,虽然没有快排.冒泡.去重.二分.希尔等算法常见,但是它的作用,在某些特定的场景下,是非常重要的. 目前es6的使用场景比较多,所以我准备能用es6的地方就 ...
- 二叉搜索树(BST)?平衡二叉树(AVL)?
二叉搜索树:中序遍历序列是有序的. 二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树: 左子节点的值比父节点小 右子节点的值比父节点大 任意节点的左右字树也分别为二叉查找树 没有键值相 ...
- 模板:二叉搜索树平衡树
文章目录 前言 二叉搜索树 代码 treap 代码 splay 开点 旋转 splay 插入 查找第k大元素 查找给定元素的排名 前驱&后继 删除 完整代码 练习总结 前言 终于开始学这个东西 ...
- 【数据结构与算法】二叉堆与二叉搜索树的区别
问题描述 记得刚学习数据结构的时候,就容易混淆二叉堆和二叉搜索树,其实虽说堆也是一种完全二叉树,但二者差别还是挺大的,本文试做分析. 逻辑结构 二叉堆和二叉搜索树都是结点带权重,并在父子结点间满足某种 ...
- Golang Java 实现 【将有序数组装换为二叉搜索树】
LeetCode 108道 .将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树. 高度平衡 二叉 ...
最新文章
- 余承东没有吹牛:华为首次超越三星,成为全球最大手机供应商
- 什么是推理统计(inferential statistics)?
- Ubuntu 下添加OpenERP command 快捷启动方式
- db设计专用excel_注塑模具设计与加工解决方案
- 难点—在引用数组元素时指针的运算
- 数据结构---BF字符串模式匹配
- LeetCode 2065. 最大化一张图中的路径价值(DFS)
- php树形数据结构是什么,数据结构 之 树
- Java 数组转 List 的三种方式及对比
- Linux学习笔记7-磁盘管理
- 苹果电脑如何修改环境变量
- 螺旋矩阵的上下左右四指针解法
- 手动搭建Kubernetes1.8高可用集群(6)calico
- 保密管理规定 涉密计算机销毁,涉密文件保密制度
- 【Hulu独家面试宝典】助你决胜校招技术面
- python涨工资问题_7-45 jmu-python-涨工资 (10 分)
- 1.4 Kronecker积
- LoadLibrary failed with error 1114:动态链接库(DLL)初始化例程失败 解决方法
- 介绍两款常用的“图表统计图的插件
- 人口密度可视化_使用GeoPandas可视化菲律宾的人口密度