如果当前递归到的这个结点的元素值小于我们用户传递进来的key的话我们将其往左进行递归
if(key > tree.key){tree.right=delete(tree.right,key);}
如果大于的话我们就往右进行递归
else if(key<tree.key){tree.left=delete(tree.left,key);}
如果说用户传递过来的key与当前结点的key值相等的话 , 那么说明当前的这个结点就是我们要删除的这个结点
else{//待删除的key等于当前结点的key , 说明当前结点就是要删除的结点//1、如果当前结点的右子树不存在 , 则直接返回当前结点的左子结点if(tree.right==null){n--;return tree.left;}//2、如果当前结点的左子树不存在 , 则直接返回当前结点的右子结点if(tree.left==null){n--;returntree.right;}//当前结点的左右子树都存在//找到右子树中的最小结点Node minNode=tree.right;//二叉查找树的左结点一定比右结点小if(minNode.left!=null){minNode=minNode.left;}//到这里就找到了当前结点右子树中最小的结点minNode//删除右子树中最小的结点Node node=tree.right;while (node.left!=null){if(node.left.left==null){//说明N的左结点就是我们要找的最小结点node.left=null;}else{node=node.left;}}//到这里 , 最小结点已经被删除了//让被删除结点的左子树成为最小结点的左子树 , 让被删除结点的右子树 , 成为最小结点的右子树minNode.left=tree.left;minNode.right=tree.right;//让被删除结点的父结点指向最小结点tree=minNode;//个数减1n--;}return tree;}
现在又要研究二叉树中的删除方法中结点的性质了 , 我们既然要把这个元素进行删除操作的话 , 那么是不是 , 我们就要将他的子结点的层级往上提升一级 , 那么我们接着研究:
//待删除的key等于当前结点的key , 说明当前结点就是要删除的结点//1、如果当前结点的右子树不存在 , 则直接返回当前结点的左子结点if(tree.right==null){n--;return tree.left;}//2、如果当前结点的左子树不存在 , 则直接返回当前结点的右子结点if(tree.left==null){n--;returntree.right;}
如果当前结点的右子树不存在 , 那么我们就把该结点的左子树给他提上去
如果当前结点的左子树不存在 , 那么我们就把他的右子树提上去
如果说当前结点的左右子树都存在的话 , 那么就有点小麻烦了 , 那么我们就要从要被删除的这个结点的右子树中找到他的最小元素 , 然后把他的最小元素给他提上去 。
//到这里就找到了当前结点右子树中最小的结点minNode//删除右子树中最小的结点Node node=tree.right;while (node.left!=null){if(node.left.left==null){//说明N的左结点就是我们要找的最小结点node.left=null;}else{node=node.left;}}//到这里 , 最小结点已经被删除了//让被删除结点的左子树成为最小结点的左子树 , 让被删除结点的右子树 , 成为最小结点的右子树minNode.left=tree.left;minNode.right=tree.right;//让被删除结点的父结点指向最小结点tree=minNode;//个数减1n--;}
最后在我们所有操作都已经执行完毕之后 , 我们只要返回这个改变之后的tree就好了
好了 , 现在我们创建一个外部类Test1来验证此程序的正确性
class Test1{public static void main(String[] args) {BinaryTree tree=new BinaryTree();tree.put(8,"鸡霸");tree.put(7,"田七");tree.put(9,"吴久");tree.put(3,"张三");tree.put(6,"陆远");System.out.println(tree.get(7));tree.delete(6);tree.delete(9);tree.delete(3);System.out.println(tree.size());}}
然后我放出全部代码方便大家实验:
package com.gm.tree;public class BinaryTree {//记录一个根结点private Node root;//记录树中的元素个数private int n;public BinaryTree() {}//向树中插入一个键值对public void put(Integer key,String value){root=put(root,key,value);}//给指定的数x添加一个键,添加一个键值对 , 并返回添加后的新数private Node put(Node tree,Integer key,String value){if(tree==null){//个数加1n++;//直接把新结点当成根结点使用return new Node(null,null,key,value);}//比较key,如果新结点大于当前结点的key , 继续寻找当前结点的右子结点if(key > tree.key){tree.right=put(tree.right,key,value);}else if(key<tree.key){//新结点的key小于当前结点的key,继续找当前结点的左子结点tree.left=put(tree.left,key,value);}else{//新结点的key等于当前结点的keytree.value=https://www.isolves.com/it/cxkf/sf/2021-04-12/value;}return tree;}//从树中找到对应的值public String get(Integer key){return get(root,key);}private String get(Node tree,Integer key){if(root==null){return null;}//比较key,如果新结点大于当前结点的key , 继续寻找当前结点的右子结点if(key > tree.key){return get(tree.right,key);}else if(key
推荐阅读
- 想验证安装的操作系统是否正版,可以这样找到Win10产品密钥
- 《王者荣耀》的十大变态英雄都有哪些?
- 多种PLC之间互相交换数据的方法,建议收藏
- 世界最深的洋是什么?
- 并发插入引发的死锁问题排查
- 面试你应该知道的 MySQL 锁
- 「MySQL笔记」left join-on-and 与 left join-on-where 的区别
- 苍蝇痣是怎么形成的 苍蝇屎是痣吗
- 常见的苍蝇种类 绿蝇和麻蝇有什么异同
- Raid 0、Raid 1、Raid 5、Raid 10、热备盘配置步骤详解