二叉搜索树(二叉排序树)—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左子树的最大值
        }
     }
}

🔎结尾

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

相关文章
|
20天前
|
存储 Java
1038. 从二叉搜索树到更大和树 --力扣 --JAVA
给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下, 二叉搜索树 满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
40 1
|
20天前
|
Java BI
Java 实现二叉排序树(BST)
Java 实现二叉排序树(BST)
13 0
|
20天前
|
Java
java如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。
这段内容介绍了Java中使用AVL树实现高效二叉搜索树的方法。AVL树是一种自平衡树,节点子树高度差不超过1,确保操作时间复杂度为O(log n)。代码包括了`Node`类和`AVLTree`类,实现了节点、插入、删除、查找和平衡旋转等方法。通过旋转操作,维持树的平衡,保证了搜索效率。
18 6
|
20天前
|
Java
LeetCode题解-二叉搜索树中第K小的元素-Java
LeetCode题解-二叉搜索树中第K小的元素-Java
14 0
|
20天前
|
算法 C++ Java
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
25 0
Java每日一练(20230504) 位1的个数、移除元素、验证二叉搜索树
|
20天前
|
存储 Java Serverless
二叉搜索树 和 哈希表 (JAVA)
【1月更文挑战第1天】阿里云初体验 二叉搜索树 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的删除 哈希表 哈希冲突 闭散列 线性探测法 二次探测法 开散列 二叉搜索树又称二叉排序树,它具有以下性质的二叉树或空树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的每颗子树也分别为二叉搜索树 而哈希表是一种插入/删除/查找时间复杂度都是O(1)的数据结构,它的查询之所以也可以如此之快的的原因就是它在查找时不需要经过任何比较,直接一次从表中得到要搜索的元素。
40 0
二叉搜索树 和 哈希表 (JAVA)
|
20天前
|
存储 算法 Java
230. 二叉搜索树中第K小的元素 --力扣 --JAVA
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
124 3
|
20天前
|
Java
98. 验证二叉搜索树 --力扣 --JAVA
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 -2^31 <= Node.val <= 2^31 - 1
31 0
98. 验证二叉搜索树 --力扣 --JAVA
|
Java
二叉排序树代码实现(java版)(下)
二叉排序树代码实现(java版)
144 0
|
Java
二叉排序树代码实现(java版)(上)
二叉排序树代码实现(java版)
125 0