二叉搜索树的两种实现(数组模拟,STL)
书上实现:
二叉搜索数的特点:高效实现 插入一个数值,查询是否包含某个数值,删除某一个数值。
所有的节点都满足左子树上的所有节点都比自己的小,而右子树上的所有节点都比自己大的特点。
查询:如果当前数值等于根节点返回true,比根节点小,就往左儿子走,否则往右儿子走。
插入:按照查找数值的方法去找其所在位置,从根节点出发,往左右儿子中找到合适位置。
删除:需要删除的节点没有左儿子,那么就把右儿子提上去。
需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去
以上两种情况都不符合的话,就把左儿子的子孙中最大的节点提到需要删除的节点上。
#include <cstdio>
struct node { //树
int val; //节点的值
node *lch, *rch; //左右儿子
};
node *insert(node *p,int x) {
if(p == NULL) { //如果节点为空 并赋值为x
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;
}
}
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 {
node *q;
for(q = p->lch; q->rch->rch !=NULL; q = q->rch);
node *r = q->rch;
q->rch=r->lch;
r->lch=p->lch;
r->rch=p->rch;
delete p;
return r;
}
return p;
}
int main()
{
node *root =NULL;
root=insert(root,);
root=insert(root,);
root=insert(root,);
root=insert(root,);
root=insert(root,);
root=remove(root,);
bool flag=find(root,);
bool flag1=find(root,);
printf("%d %d\n",flag,flag1);
return ;
}
set正是使用二叉搜索树维护集合的容器。
#include <cstdio>
#include <set>
using namespace std; int main() { set<int> s; s.insert();
s.insert();
s.insert(); set<int>::iterator it; it=s.find();
if(it == s.end()) puts("not found");
else puts("found"); it=s.find();
if(it == s.end()) puts("not found");
else puts("find"); s.erase();
if(s.count()!=) puts("found");
else puts("not found"); for(it = s.begin(); it != s.end(); it++) {
printf("%d\n",*it);
}
return ;
}
map 是维护则是维护键和键对应值的容器。
#include <cstdio>
#include <map>
#include <string>
#include <iostream>
using namespace std; int main() { map<int, const char*>m; m.insert(make_pair(,"ONE"));
m.insert(make_pair(,"THE")); m.insert(make_pair(,"HYNU"));
m[]="hynuacm"; map<int,const char*>::iterator it; it=m.find();
puts(it->second);
it=m.find();
if(it == m.end()) puts("not found");
else puts(it->second); puts(m[]); m.erase(); for(it = m.begin(); it != m.end(); it++) {
printf("%d: %s\n",it->first,it->second);
}
return ;
}
二叉搜索树的两种实现(数组模拟,STL)的更多相关文章
- 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)
目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...
- 41.Validate Binary Search Tree(判断是否为二叉搜索树)
Level: Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assu ...
- LeetCode【108. 将有序数组转换为二叉搜索树】
又是二叉树,最开始都忘记了二叉搜索树是什么意思,搜索了一下: 二叉搜索树:左节点都小于右节点,在这里就可以考虑将数组中的中间值作为根节点 平衡二叉树:就是左右节点高度不大于1 树就可以想到递归与迭代, ...
- Java二叉搜索树实现
树集合了数组(查找速度快)和链表(插入.删除速度快)的优点 二叉树是一种特殊的树,即:树中的每个节点最多只能有两个子节点 二叉搜索树是一种特殊的二叉树,即:节点的左子节点的值都小于这个节点的值,节点的 ...
- hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)
二叉搜索树 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- Java 二叉搜索树 实现和学习
/** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...
- 数据结构☞二叉搜索树BST
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...
- Interview----判断整数序列是否是二叉搜索树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: ...
- 自己动手实现java数据结构(六)二叉搜索树
1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...
随机推荐
- JS设计模式——5.单体模式
JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...
- json 处理
//String sssssString = "{"response":{"data":[{"address":"南京市 ...
- Sqli-labs less 26a
Less-26a 这关与26的区别在于,sql语句添加了一个括号,同时在sql语句执行抛出错误后并不在前台页面输出.所有我们排除报错注入,这里依旧是利用union注入. sql语句为SELECT * ...
- Python编程指南 chapter 1
1.python使用方括号[]来存取一个序列中的某个数据项,像字符串.列表等包含若干数据项的序列都采用这种方法. 2.强制类型转换,int('24234'),str(235) 3.python中没有变 ...
- C#&java重学笔记(面向对象)
C#部分 1.C#有一个internal关键字,指字段可以同一个程序集中访问,出了程序集不行.还有一个protected internal(没有先后之分)修饰词,指只能在同一个程序集中的子类访问 2. ...
- Selenium中expected_conditions下text_to_be_present_in_element_value方法的使用
text_to_be_present_in_element: 判断某个元素中的text是否包含了预期的字符串 text_to_be_present_in_element_value: 判断某个元素中的 ...
- (转)Maximum subarray problem--Kadane’s Algorithm
转自:http://kartikkukreja.wordpress.com/2013/06/17/kadanes-algorithm/ 本来打算自己写的,后来看到上述链接的博客已经说得很清楚了,就不重 ...
- C# 匿名方法 1027
class Program { static void Main(string[] args) { SorAndShowFiles("Sorted by name", delega ...
- BroadcastReceiver应用1
有两种注册方式:1. 在AndroidManifest中注册.2. 在代码中直接注册,这种注册需要注意的一点是:当注册此Receiver的Activity退出的时候,一定要调用unregisterRe ...
- MapReduce实例
1.WordCount(统计单词) 经典的运用MapReuce编程模型的实例 1.1 Description 给定一系列的单词/数据,输出每个单词/数据的数量 1.2 Sample a is b is ...