二叉搜索树

二叉树搜索树规则

在这里插入图片描述

在这里插入图片描述

二叉树不设下限,面对这种情况,查找的时间复杂度时O(N)
在这里插入图片描述
但是二叉搜索树的规则意义在于,对树进行中序遍历,输出数据是有序的,并且进行了去重
这两个功能是顺便达到的,它的核心还是查找

非递归版本

小困难

在中序遍历时,调用时无法获取BSTree中私有的Node* _root
在这里插入图片描述

我们可以搞一个getRoot()函数来返回_root,但是这里采用了更好的方式,就是利用类内一个函数套子函数的方式便可以直接访问_root

这个技巧在二叉搜索树中会大量使用
在这里插入图片描述

插入

二叉搜索树不允许相同的值插入,如果插入的值相同就返回假,插入成功就返回真

根据二叉搜索树的规则,cur走到空,并且需要和prev比大小确定cur插入到Parent的左 or 右
在这里插入图片描述

查找key

从根开始找,key > root->val就往右,小于就往左

删除

删除结点分为2种情况
1.托孤
删除结点无子树
删除结点只有1个子树
2.替换法
删除结点既有左子树又有右子树,只能寻求左子树中最大的,或者右子树中最小的
例如:7,8,10 删除8 备选是7 or 10
在这里插入图片描述

在这里插入图片描述
替换法细节
我们在删除是需要判断leftMax是parent的左子树 or 右子树
因为leftMax都是右为空,则判断出来左子树 or 右子树 就让parent链接leftMax的左子树即可
在这里插入图片描述
托孤时同样不确定cur是parent的左子树 or 右子树 同样需要判断
在这里插入图片描述

递归版本

在这里插入图片描述
递归版本更是运用了子函数方便获取_root
在这里插入图片描述

插入和 查找

在这里插入图片描述

他们都是根据二次搜索树的规则,如果比根大就递归进入右子树,比根小就递归进入左子树
插入如果到达空,即可插入
在这里插入图片描述
插入利用了形参引用,使得找到的位置就是实参所在的结点位置,可以直接修改root本身

删除

递归因为可以利用引用传入实参的根结点指针,所以不用寻找parent结点指针,直接就可以修改实参parent的指向
在这里插入图片描述

同样面对托孤,替换法

替换法
要删除8,和leftMax交换后,leftMax一定是可以利用托孤删除的,它右为空
7和8交换后,树不是搜索树了,在当前树中无法递归删除8
需要转换到7的左子树中递归删除,交换到leftMax的值比leftMax还大,符合搜索树规则
利用递归删除结点8左子树中的leftMax
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值