文章插图
主要方法
- 既然已经构造号一棵树,那么就需要实现主要的方法 。因为二叉排序树中每个节点都能看作一棵树 。所以我们创建方法的是时候加上节点参数(也就是函数对每一个节点都能有效)
findmin()找到最小节点:
- 因为所有节点的最小都是往左插入,所以只需要找到最左侧的返回即可 。
- 因为所有节点大的都是往右面插入,所以只需要找到最右侧的返回即可 。
- 代码使用递归函数
文章插图
isContains(int x)
这里的意思是查找二叉查找树中是否存在x 。
- 假设我们我们插入x,那么如果存在x我们一定会在查找插入路径的过程中遇到x 。因为你可以如果已经存在的点,再它的前方会走一次和它相同的步骤 。也就是说前面固定,我来1w次x,那么x都会到达这个位置 。那么我们直接进行查找比较即可!
插入的思想和前面isContains类似 。找到自己的位置(空位置)插入 。但是又不太一样 。你可能会疑问为什么不直接找到最后一个空,然后将current赋值过去current=new node(x) 。这样的化current就相当于指向一个new node(x)节点 。和树就脱离关系,所以要提前判定是否为空,若为空将它的left或者right赋值即可 。
public node insert(int x)// 插入 t是root的引用{ node current = root; if (root == null) {root = new node(x);return root; } while (current != null) {if (x < current.value) {if (current.left == null) {return current.left = new node(x);}else current = current.left;}else if (x > current.value) {if (current.right == null) {return current.right = new node(x);}else current = current.right;} } return current;//其中用不到}
- 比如说上面结构插入51
文章插图
delete(int x)
删除操作算是一个相对较难理解的操作了 。
删除节点规则:
- 先找到这个点 。这个点用这个点的子树可以补上的点填充该点,然后在以这个点为头删除替代的子节点(调用递归)然后在添加到最后情况(只有一个分支,等等) 。
- 首先要找到移除的位置,然后移除的那个点分类讨论,如果有两个儿子,就选右边儿子的最左侧那个点替代,然后再子树删除替代的那个点 。如果是一个节点,判断是左空还是右空,将这个点指向不空的那个 。不空的那个就替代了这个节点 。入股左右都是空,那么他自己变空null就删除了 。
- 这种情况不需要考虑,直接删除即可 。(途中红色点) 。另节点=null即可 。
文章插图
左节点为空、右节点为空:
- 此种情况也很容易,直接将删除点的子节点放到被删除位置即可 。
文章插图
左右节点均不空
- 这种情况相对是复杂的 。因为这涉及到一个策略问题 。
文章插图
- 如果拿19或者71节点填补 。虽然可以保证部分侧大于小于该节点,但是会引起合并的混乱.比如你若用71替代23节点 。那么你需要考虑三个节点(19,50,75)之间如何处理,还要考虑他们是否满,是否有子女 。这是个极其复杂的过程 。
- 首先,我们要分析我们要的这个点的属性:能够继承被删除点的所有属性 。如果取左侧节点(例如17)那么首先能满足所有右侧节点都比他大(右侧比左侧大) 。那么就要再这边选一个最大的点让左半枝都比它小 。我们分析左支最大的点一定是子树最右侧!
推荐阅读
- Linux查找文件内容和字符串之grep与egrep的区别
- 机构内部数据库教程,Join算法
- 阐述茶叶的储存要求与方法
- 使用python构建递归算法,实现查找电脑中的所有文件
- 邱淑贞的性感与演技 红灯区邱淑贞
- 吕布董卓貂蝉这三个人是什么关系 董卓吕布与貂蝉的关系
- 微信小程序分销商城有什么功能与特点
- 手机信号的强弱与什么有关?手机壳会影响手机信号吗?长知识了
- 科学冲泡红茶好处多
- 绿茶与乌龙茶的差异