二叉搜索树

文章目录

  • 二叉树搜索树规则
  • 非递归版本
    • 小困难
    • 插入
    • 查找key
    • 删除
  • 递归版本
    • 插入和 查找
    • 删除

二叉树搜索树规则

二叉搜索树_第1张图片

二叉搜索树_第2张图片

二叉树不设下限,面对这种情况,查找的时间复杂度时O(N)
二叉搜索树_第3张图片

非递归版本

小困难

在中序遍历时,调用时无法获取BSTree中私有的Node* _root
我们可以搞一个getRoot()函数来返回_root,但是这里采用了更好的方式,就是利用类内一个函数套子函数的方式便可以直接访问_root

这个技巧在二叉搜索树中会大量使用
二叉搜索树_第4张图片

插入

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

根据二叉搜索树的规则,cur走到空,并且需要和prev比大小确定cur插入到Parent的左 or 右
二叉搜索树_第5张图片

查找key

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

删除

删除结点分为2种情况
1.托孤
删除结点无子树
删除结点只有1个子树
2.替换法
删除结点既有左子树又有右子树,只能寻求左子树中最大的,或者右子树中最小的
例如:7,8,10 删除8 备选是7 or 10
二叉搜索树_第6张图片

二叉搜索树_第7张图片
替换法细节
我们在删除是需要判断leftMax是parent的左子树 or 右子树
因为leftMax都是右为空,则判断出来左子树 or 右子树 就让parent链接leftMax的左子树即可
二叉搜索树_第8张图片
托孤时同样不确定cur是parent的左子树 or 右子树 同样需要判断
二叉搜索树_第9张图片

递归版本

二叉搜索树_第10张图片
递归版本更是运用了子函数方便获取_root
二叉搜索树_第11张图片

插入和 查找

二叉搜索树_第12张图片

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

删除

递归因为可以利用引用传入实参的根结点指针,所以不用寻找parent结点指针,直接就可以修改实参parent的指向
二叉搜索树_第14张图片

同样面对托孤,替换法

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

你可能感兴趣的:(C++,c++)