二叉树搜索树规则
二叉树不设下限,面对这种情况,查找的时间复杂度时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