二叉搜索树的两种实现(数组模拟,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 }
时间: 2024-10-10 16:56:40

二叉搜索树的两种实现(数组模拟,STL)的相关文章

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

目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j

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

Level: ??Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contain

剑指——二叉搜索树的后序遍历

二叉搜索树的后序遍历 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 给出的数组是后序遍历,那么最后一个元素对应着树的根节点. 数组前部分对应左子树,其中元素都小于根节点:后部分对应右子树,其中元素都大于根节点. 再分别对左右子树进行递归地判断. public class Solution { public boolean VerifySquenceOfBST(int [] sequence)

C++实现二叉搜索树的常用操作

实现操作 (1)二叉搜索树的建立 (2)二叉搜索树的插入 (3)二叉搜索树的三种递归遍历(前序.中序和后续) (4)二叉搜索树的三种非递归遍历(前序.中序和后续) (5)二叉搜索树的逐层打印 (6)搜索某一个字符(递归算法) (7)搜索一个字符(非递归算法) (8)查找最大元素 (9)查找最小元素 有时间再实现: (10)二叉搜索树的前驱和后继查找 (11)二叉搜索树的删除 源码分析: #include <iostream> #include <stack> #include &l

二叉搜索树JAVA实现

引入: 二叉搜索树是这样的一种二叉树: (1)每个元素都有一个关键值,并且没有任意两个元素有相同的关键值 (2)根节点的左子树中任意元素的关键值小于根节点的关键值. (3)根节点的右子树中任意元素的关键值大于根节点的关键值. (4)根节点的左右子树也是二叉搜索树. 我们这里就用程序来实现这样一颗二叉搜索树. 分析: 从定义看出,二叉搜索树是一种特殊的二叉树,它给每个元素加上了序的概念,但又不同于最大最小堆,它总是 左<根<右的.我们分别看常用的几个操作. 查找: 关键值查找很简单,就是从根元素

二叉搜索树的实现源码(源码较长,请慎入)

实现二叉搜索树的一种好方法是利用二叉树抽象数据类型. 我们以BisTree这个名称来代表二叉搜索树这种数据结构.通过typedef方式将BisTree(二叉搜索树)实现为BiTree(二叉树)的别名. 采用typedef方法使得二叉搜索树具有了某种程度的多态能力,如同栈和队列一样.这意味着除了专属于二叉搜索树的操作外,还可以在其上执行属于二叉树的操作. 数据结构AvlNode代表树中的结点,AvlNode包含3个成员: data是存储在结点中的数据:hidden用来标识结点是否已经移除:fact

用Python实现数据结构之二叉搜索树

二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 一个图例: 基于二叉搜索树的这种关系,我们可以用它来实现有序映射 遍历二叉搜索树 基于二叉搜索树的特性,采用中序遍历的方式可以使得遍历结果是按照从小到大的顺序排列的.了解中序遍历可以参考用Python实现数据结构之树 这里还需要思考的一个内容是在基于中序遍历的前提下,如何求一个节点的后继节点或前驱节

二叉树之二叉搜索树(BSTree)

二叉搜索树(Binary Search Tree) 二叉搜索树是一种二叉树,子结点数量上限为2:为了方便搜索,结点是有序的,左结点的key不大于父节点,右节点的key不小于父节点,且左右子树也是二叉搜索树. 下面是一个二叉搜索树的样图,来自维基 一棵树一般都要提供一些函数,例如遍历.搜索.最大最小值.插入,删除,销毁等 代码含注释,下面是输出效果(msys2) 代码 开发环境:Qt Creator 4.8.2 Mingw64 7.3 windows 8.1 完整代码:https://github

小白专场-是否同一颗二叉搜索树-python语言实现

目录 一.二叉搜索树的相同判断 二.问题引入 三.举例分析 四.方法探讨 4.1 中序遍历 4.2 层序遍历 4.3 先序遍历 4.4 后序遍历 五.总结 六.代码实现 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html 一.二叉搜索树的相同判断 二叉搜索树是一种特殊的二叉树,在一定程度上是基于二分查找思想产生的,在它的任何一个节点node处,node的左子