前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【CPP】各种各样的树(3)——二叉查找树

【CPP】各种各样的树(3)——二叉查找树

作者头像
ZifengHuang
发布2020-07-29 15:29:55
2410
发布2020-07-29 15:29:55
举报
文章被收录于专栏:未竟东方白未竟东方白

说完普通的二叉树,接下来是这个二叉树的一种变形,二叉查找树。

二叉查找树,其实就是加了一点限制条件的二叉树,我们限制二叉查找的每一个结点的左子树都小于右子树,按照这个规则进行插入和删除,这样就形成了一棵二叉查找树。起这个名字很显然表示了它的用途,由于数据依据大小规则插入的原因,我们可以较快地查找到所需要的数据。

先来看看声明:

结点的声明与上次没什么区别,只是这次采用了类而不是结构体来写结点,可以使用构造函数来新建结点了。

二叉树这次要来实现几个重要功能:查找,插入,删除。

首先是查找操作,我们先假定我们有一个已经构造好的二叉查照树,很容易就能想到查找的方法,从根节点开始向下搜索,一个一个与搜索到的父节点比较然后向相应方向继续递归下去,知道找到为止,代码也很好写。

然后是也比较常用的FindPre寻找父节点的操作。

接着是插入操作,如前所述,我们需要遍历整个二叉树,寻找到对应的叶子结点然后进行比较,按照规则将结点新建进去,其实这就是查找Find的拓展版本,也很好实现。

然后是比较复杂的删除Delete操作,删除操作的主要思想是,取待删除结点的右子树的最小结点(最左结点)来替代删除的结点,然后取递归删除那个最小结点,这个思想也并不复杂,只是比查找与插入难一点点,代码如下。

这种删除有个很明显的缺点,每次当目标有左右结点时,我们都是取目标结点右子树的最小结点替换然后删去那个最小结点。而如果不断插入删除,久而久之,右子树会越来短,左子树由于积累会变得很深,致使查找的效率越来越低。所以我们需要一个平衡的二叉树来保证查找的效率,能自己进行平衡的二叉树我们以后再说。

最后是将其打印出来,简单的前序遍历加适当的空格就能打印得比较好看了。

最后我们在主函数里测试一下它。

说完了查找二叉树,想必也使用了几次二叉树的遍历了,也能看出二叉树遍历时的一些缺陷吧。什么缺陷呢,下篇文章来说说线索二叉树。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未竟东方白 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档