【模板】二叉搜索树
来源:互联网 发布:淘宝网禁止黄赌毒 编辑:程序博客网 时间:2024/05/22 14:19
二叉搜索树:对于二叉树中的任意节点,左子树中所有的值都小于当前位置的值,右子树中所有的值都大于当前位置的值。
操作:
1.插入一个数值。
2.查询是否包含某个数值。
3.删除某个数值。
插入和查找是差不多的,都是比当前值(要找的值)大就往左走,否则就往右走,直到找到为止。
最复杂的操作是删除某个节点,不过可以分为3种情况来讨论:
1.需要删除的节点没有左子树,那就把右子树提上去。
2.需要删除的节点的左子树没有右子树,那就把左子树提上去。
3.其他情况,把左子树中最大的节点提到当前删除的节点的位置。
所有操作的时间复杂度都是O(log(n))。
还是比较高效的一种数据结构。
代码:
#include <iostream>#include <algorithm>#include <map>#include <vector>#include <set>#include <math.h>#include <queue> using namespace std;typedef long long ll;#define INF 2147483647//表示节点的结构体 struct node{ int val; node *lch, *rch;};//如果小于当前节点往左走,否则往右走,直到走到空为止,把要插入的节点放在这。//返回值意义是更新当前子树,想象一下从最下层开始返回的情况。 node *insert(node *p,int x){ if(p == NULL){ node *q = new node; q->val = x; q->lch = q->rch = NULL; return q; }else{ if(x < p->val) p->lch = insert(p->lch, x); else p->rch = insert(p->rch, x); return p; }}//查找数值x。//每一个节点当做一棵子树,如果当前节点不是就找它的左右子树。 bool find(node *p,int x){ if(p == NULL) return false; else if(x == p->val) return true; else if(x < p->val) return find(p->lch, x); else return find(p->rch, x);}node *remove(node *p, int x){ if(p == NULL) return NULL; //当前子树没有找到,如果一个节点的左右子树都返回NULL表明当前子树没有找到 else if(x < p->val) p->lch = remove(p->lch, x); //向左走 else if(x > p->val) p->rch = remove(p->rch, x); //向右走 //以下为找到了的情况 //左子树为空,先保存右子树,再删除当前节点,把右子树直接挂在删除节点的原先位置。 else if(p->lch == NULL){ node *q = p->rch; delete p; return q; //左子树的右子树为空,把删除节点的左子树挂在当前位置,把删除节点的右子树挂在当前位置的右边 //这样保证了搜索树的性质 }else if(p->lch->rch == NULL){ node *q = p->lch; q->rch = p->rch; delete p; return q; }else{ //找到删除节点左子树的最右边的节点,即左子树中的最大值 q->rch node *q; for(q = p->lch;q->rch->rch != NULL; q = q->rch); //把最大值节点q->rch用r保存下来,把最大值节点的左子树提上来 node *r = q->rch; q->rch = r->lch; //把最大值节点r放在了原先删除节点的位置 r->lch = p->lch; r->rch = p->rch; delete p; return r; } return p;}int main(){ return 0;}
阅读全文
0 0
- 模板--二叉搜索树
- 二叉搜索树【模板】
- 【模板】二叉搜索树
- C++ 二叉搜索树 模板
- HDU3791 二叉搜索树(构建二叉搜索树模板)
- [BSTree] 二叉搜索树 -- C++ 模板实现
- 二叉搜索树(BST)模板
- 算法导论:二叉搜索树模板
- 二叉搜索树和红黑树概述以及模板实现(1)
- C++实现二叉搜索树(二叉排序树)模板类
- HDU5444 Elven Postman(搜索二叉树模板)
- 二叉树应用-二叉搜索树类模板的实现(数据结构基础 第6周)
- 【二叉搜索数】HDU3791二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 【搜索树】二叉搜索树
- 二叉搜索树BSTree
- 007 PyQuery
- Android 自定义布局对话框
- git创建仓库
- Java8函数式编程之三:函数式接口
- 用R进行文本挖掘与分析--软件分词统计词频
- 【模板】二叉搜索树
- git的传输协议及各自优缺点(本地传输协议,ssh,http,git)
- hessian原理分析(二)
- IO口模拟SPI总线问题
- 求利息与本金的和
- HashMap 数据结构 实现原理
- java基础(集合List-ArrayList、LinkedList、Vector的区别)
- Linux命令行六大技巧
- 三周第三次课 2017.11.01 su命令、sudo命令、限制root远程登录