二叉搜索树(二叉排序树)—Java(下)

简介: 二叉搜索树(二叉排序树)—Java(下)

🌼cur.left != null && cur.right != null–>要删除节点的左右均不为空

找cur左子树的右叶子节点–>左子树的最大值–>最大值的右节点一定为null

找cur右子树的左叶子节点–>右子树的最小值–>最小值的左节点一定为null

不可以是左子树的左叶子节点(左子树最小值) or 右子树的右叶子节点(右子树最大值)


🌼代码演示

以cur的右子树的最小值举例

以cur的左子树的最大值举例


🌼完整remove代码

public void remove(int val) {
        TreeNode cur = root;
        TreeNode pre = null;
        while(cur != null) {
            if(cur.val == val) {//找到了值为val的节点
                removeNode(pre,cur);
                return;
            }
            else if(cur.val < val) {
                pre = cur;
                cur = cur.right;
            }else {//cur.val > val
                pre = cur;
                cur = cur.left;
            }
        }
}
//删除值为val的cur节点
private void removeNode(TreeNode pre,TreeNode cur) {
        if(cur.left == null) {
            if(cur == root) {
                root = cur.right;
            }else if(pre.left == cur){//cur在父节点左侧
                pre.left = cur.right;
            }else {//pre.right = cur --> //cur在父节点右侧
                pre.right = cur.right;
            }
        }else if(cur.right == null) {
            if(cur == root) {
                root = cur.left;
            }else if(pre.left == cur) {//cur在父节点左侧
                pre.left = cur.left;
            }else {//pre.right = cur --> //cur在父节点右侧
                pre.right = cur.left;
            }
        }else {//cur.left != null && cur.right != null
            TreeNode targetPre = cur;
            TreeNode target = cur.right;
            while(target.left != null) {//以cur的右子树的最小值举例-->右子树的左叶子节点
                //也可以是cur的左子树的最大值-->左子树的右叶子节点
                targetPre = target;
                target = target.left;
            }
            cur.val = target.val;
            //此时target的左侧一定为null-->target.left == null
            targetPre.left = target.right;//因为是寻找cur右子树的最小值
            //一定是target == targetPre.left
            //target == targetPre.right-->这种情况只会出现在寻找cur左子树的最大值
        }
}

🌻完整模拟代码

public class TestBinarySearch {
    static class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;
        public TreeNode(int val) {
            this.val = val;
        }
    }
    public TreeNode root = null;//根节点
    //查找二叉搜索树中指定的val值
    public TreeNode find(int val) {
        TreeNode cur = root;
        while(cur != null) {
            if(cur.val < val) {
                cur = cur.right;
            }else if(cur.val > val) {
                cur = cur.left;
            }else {//cur.val == val-->find!
                return cur;
            }
        }
        //未找到
        return null;
    }
    //插入元素
    public void insert(int val) {
        if(root == null) {
            root = new TreeNode(val);
            return;
        }
        TreeNode pre = null;
        TreeNode cur = root;
        while(cur != null) {
            pre = cur;
            if(cur.val < val) {
                cur = cur.right;
            }else if(cur.val > val){
                cur = cur.left;
            }else {//二叉搜索树中不要插入相同的数据(无意义)
                return;
            }
        }
        if(val < pre.val) {
            pre.left = new TreeNode(val);
        }else {
            pre.right = new TreeNode(val);
        }
    }
    //中序遍历
    public void inOrder(TreeNode root) {
        if(root == null) return;
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
    }
    //删除
    public void remove(int val) {
        TreeNode cur = root;
        TreeNode pre = null;
        while(cur != null) {//找到了值为val的节点
            if(cur.val == val) {
                removeNode(pre,cur);
                return;
            }
            else if(cur.val < val) {
                pre = cur;
                cur = cur.right;
            }else {//cur.val > val
                pre = cur;
                cur = cur.left;
            }
        }
    }
    //删除值为val的cur节点
    private void removeNode(TreeNode pre,TreeNode cur) {
        if(cur.left == null) {
            if(cur == root) {
                root = cur.right;
            }else if(pre.left == cur){//cur在父节点左侧
                pre.left = cur.right;
            }else {//pre.right = cur --> //cur在父节点右侧
                pre.right = cur.right;
            }
        }else if(cur.right == null) {
            if(cur == root) {
                root = cur.left;
            }else if(pre.left == cur) {//cur在父节点左侧
                pre.left = cur.left;
            }else {//pre.right = cur --> //cur在父节点右侧
                pre.right = cur.left;
            }
        }else {//cur.left != null && cur.right != null
            TreeNode targetPre = cur;
            TreeNode target = cur.right;
            while(target.left != null) {//以cur的右子树的最小值举例-->右子树的左叶子节点
                //也可以是cur的左子树的最大值-->左子树的右叶子节点
                targetPre = target;
                target = target.left;
            }
            cur.val = target.val;
            //此时target的左侧一定为null-->target.left == null
            targetPre.left = target.right;//因为是寻找cur右子树的最小值
            //一定是target == targetPre.left
            //target == targetPre.right-->只会出现在寻找cur左子树的最大值
        }
     }
}

🔎结尾

欢迎各位点赞留言,如果有不懂可以在评论区探讨或者私信,希望和大家一起进步

相关文章
|
7月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
二叉排序树(java)
二叉排序树(java)
|
Java
java如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。
这段内容介绍了Java中使用AVL树实现高效二叉搜索树的方法。AVL树是一种自平衡树,节点子树高度差不超过1,确保操作时间复杂度为O(log n)。代码包括了`Node`类和`AVLTree`类,实现了节点、插入、删除、查找和平衡旋转等方法。通过旋转操作,维持树的平衡,保证了搜索效率。
110 6
|
Java BI
Java 实现二叉排序树(BST)
Java 实现二叉排序树(BST)
94 0
|
算法 C++ Java
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
65 0
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
|
存储 Java Serverless
二叉搜索树 和 哈希表 (JAVA)
【1月更文挑战第1天】阿里云初体验 二叉搜索树 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的删除 哈希表 哈希冲突 闭散列 线性探测法 二次探测法 开散列 二叉搜索树又称二叉排序树,它具有以下性质的二叉树或空树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的每颗子树也分别为二叉搜索树 而哈希表是一种插入/删除/查找时间复杂度都是O(1)的数据结构,它的查询之所以也可以如此之快的的原因就是它在查找时不需要经过任何比较,直接一次从表中得到要搜索的元素。
107 0
二叉搜索树 和 哈希表 (JAVA)
|
存储 算法 Java
230. 二叉搜索树中第K小的元素 --力扣 --JAVA
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
172 3
|
Java
LeetCode题解-二叉搜索树中第K小的元素-Java
LeetCode题解-二叉搜索树中第K小的元素-Java
88 0
|
Java
二叉排序树代码实现(java版)(下)
二叉排序树代码实现(java版)
177 0
|
Java
二叉排序树代码实现(java版)(上)
二叉排序树代码实现(java版)
179 0

热门文章

最新文章