书上实现:

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

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

查询:如果当前数值等于根节点返回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)的更多相关文章

  1. 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

    目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...

  2. 41.Validate Binary Search Tree(判断是否为二叉搜索树)

    Level:   Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assu ...

  3. LeetCode【108. 将有序数组转换为二叉搜索树】

    又是二叉树,最开始都忘记了二叉搜索树是什么意思,搜索了一下: 二叉搜索树:左节点都小于右节点,在这里就可以考虑将数组中的中间值作为根节点 平衡二叉树:就是左右节点高度不大于1 树就可以想到递归与迭代, ...

  4. Java二叉搜索树实现

    树集合了数组(查找速度快)和链表(插入.删除速度快)的优点 二叉树是一种特殊的树,即:树中的每个节点最多只能有两个子节点 二叉搜索树是一种特殊的二叉树,即:节点的左子节点的值都小于这个节点的值,节点的 ...

  5. hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)

    二叉搜索树 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  6. Java 二叉搜索树 实现和学习

    /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...

  7. 数据结构☞二叉搜索树BST

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...

  8. Interview----判断整数序列是否是二叉搜索树的后序遍历结果

    题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:   ...

  9. 自己动手实现java数据结构(六)二叉搜索树

    1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...

随机推荐

  1. 【CentOs】开机启动与防火墙

    说明: 开机启动使用的命令式chkconfig .防火墙相关的命令式iptables 1.chkconfig 2.iptables 1.chkconfig 参数: --add   新增所指定的系统服务 ...

  2. zoj 2314 Reactor Cooling 网络流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 The terrorist group leaded by a ...

  3. 【BZOJ】【4010】【HNOI2015】菜肴制作

    拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...

  4. Leetcode#59 Spiral Matrix II

    原题地址 相比于Spiral Matrix(参见这篇文章)要简单一些,因为是方阵,所以代码简洁一些. 注意当n是奇数的时候,中心小块要单独赋值(代码21行) 代码: vector<vector& ...

  5. Beginners Guide To Learn Dimension Reduction Techniques

    Beginners Guide To Learn Dimension Reduction Techniques Introduction Brevity is the soul of wit This ...

  6. [工作积累] Android system dialog with native callback

    JNI: invoke java dialog with native callback: store native function address in java, and invoke nati ...

  7. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  8. EditorWindow edit ScriptableObject

    using UnityEngine; [System.Serializable] public class Weapon { //[SerializeField] public string weap ...

  9. D3D Deferred Shading

    在3D图形计算中,deferred shading是一个基于屏幕空间的着色技术.之所以被称为deferred shading,是因为我们将场景的光照计算与渲染"deferred"到 ...

  10. PHP5.4最新特性

     PHP5.4最新特性   官网:ChangeLog-5.php#5.4.0 原文Oracle:LAMP 体系有了新的竞争,但此版本中的特性使 PHP 再次挑战极限. 稍微做了修改.: 概述总结:1. ...