博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉搜索树
阅读量:5056 次
发布时间:2019-06-12

本文共 2092 字,大约阅读时间需要 6 分钟。

二叉搜索树是能够高效地进行如下操作的数据结构

1.插入一个数值

2.查询是否包含某个数值

3.删除某个数值

所有的节点,都满足左子树上的所有节点都比自己的小,而右子树上的所有节点都比自己大这一条件

如果有n个元素,平均每次操作需要O(log n)的时间

实现:

1 #include
2 #define INF 10000000 3 using namespace std; 4 struct node{ 5 int val; 6 node *lch,*rch; 7 }; 8 //插入数值x 9 node *insert(node *p,int x)10 {11 if(p==NULL)12 {13 node *q=new node;14 q->val=x;15 q->lch=q->rch=NULL;16 return q;17 }18 else19 {20 if(x
val) p->lch=insert(p->lch,x);21 else p->rch=insert(p->rch,x);22 return p;23 }24 }25 //查找数值x26 bool find(node *p,int x)27 {28 if(p==NULL) return false;29 else if(x==p->val) return true;30 else if(x
val) return find(p->lch,x);31 else return find(p->rch,x);32 }33 //删除数值x34 node *remove(node *p,int x)35 {36 if(p==NULL) return NULL;37 else if(x
val) p->lch=remove(p->lch,x);38 else if(x>p->val) p->rch=remove(p->rch,x);39 //需要删除的节点没有左儿子,把右儿子提上去40 else if(p->lch==NULL)41 {42 node *q=p->rch;43 delete p;44 return q;45 }46 //需要删除的节点的左儿子没有右儿子,把左儿子提上去47 else if(p->lch->rch==NULL)48 {49 node *q=p->lch;50 q->rch=p->rch;51 delete p;52 return q;53 }54 //以上两种情况都不满足,把左儿子的子孙中最大的节点提到需要删除的节点上55 else56 {57 node *q;58 for(q=p->lch;q->rch->rch!=NULL;q=q->rch);59 node *r=q->rch;60 q->rch=r->lch;61 r->lch=p->lch;62 r->rch=p->rch;63 delete p;64 return r;65 }66 return p;67 }68 int main()69 {70 node *root=NULL;71 root=insert(root,2);72 insert(root,1);73 insert(root,3);74 insert(root,7);75 cout<
<
View Code

 

c++中的STL里有set和map容器,实现了二叉搜索树。set是使用二叉搜索树维护集合的容器,map是维护键和键对应的值的容器。

在向二叉树插入节点时,如果以1,2,3,4,5.。。的顺序插入的话二叉树会变得如同一条链表一样(退化的二叉树)。

如果按照这个顺序插入,树的高度就会变成n。则操作由O(log n)变为O(n)。

而平衡二叉树通过旋转操作来保持树的平衡以避免退化情况的发生。编程语言标准中的二叉搜索树都很好地实现了平衡二叉树。

转载于:https://www.cnblogs.com/wangkaipeng/p/6435072.html

你可能感兴趣的文章
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
hadoop1.2.1 伪分布式配置
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
spring的value,null标签
查看>>
jQuery html text val方法使用
查看>>
Eclipse寻找JVM的机制
查看>>
Day2:购物车
查看>>
Maven实战(六)--- dependencies与dependencyManagement的区别
查看>>
多边形的研究
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
ubuntu 安装mysql
查看>>
方法重写与方法重载
查看>>
C#生成PDF文档,读取TXT文件内容
查看>>
VS2008完全卸载工具
查看>>