二叉搜索树的两种实现(数组模拟,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.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...
随机推荐
- 【BZOJ】【1023】【SHOI2008】cactus仙人掌图
DP+单调队列/仙人掌 题解:http://hzwer.com/4645.html->http://z55250825.blog.163.com/blog/static/150230809201 ...
- 【BZOJ】【3473】字符串
后缀数组 Orz zyf 神题不会做啊,先坑着吧……sigh //BZOJ 3473 #include<vector> #include<cstdio> #include< ...
- 【BZOJ】【1492】【NOI207】货币兑换Cash
DP/CDQ分治 orz Hzwer copy了下他的代码……结果在while(j<top......)这一句中把一个括号的位置打错了……找了我一个多小时才找到TAT 很神奇……顺便贴下CDQ的 ...
- Leetcode#150 Evaluate Reverse Polish Notation
原题地址 基本栈操作. 注意数字有可能是负的. 代码: int toInteger(string &s) { ; ] == '-' ? true : false; : ; i < s.l ...
- nginx上如何支持.htaccess伪静态转向
我们知道在apache上有一个常用的功能.htaccess转向,只要apache编译的时候指明支持rewrite模块就可以了. 但是换到nginx上方法会有一点不一样,网上很多人说把.htaccess ...
- android adb: wireless debug
http://developer.android.com/tools/help/adb.html#wireless
- eclipse 自动 注释
在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的. 修改作者.日期注释格式:打开Windows->Preferences->Java->Co ...
- AESEncrypter加密算法代码示例
package testJava.java; import java.security.SecureRandom; import java.util.Base64; import javax.cryp ...
- GA项目体会
1.NaN表示运算的结果是未定义的计算过程,例如0/0.在计算EBO的时候,由于使用泊松分布的计算过程,出现了0/0的情况,所以控制台才会提示"非数字". 2.保障资金太小的时候可 ...
- [C++]内存字节对齐
当我们写一个class类,然后sizeof(),然后发现这个值往往比你想象的大,这是为什么呢?这里就要讲到内存对齐的问题. 先来看一下内存对齐的几条原则: 1.对于class(struct/union ...