Java实现二叉排序树

public int delRightTreeMin(Node node){

    Node target = node;

    //循环的查找左节点,就会找到最小值

    while (target.left != null){

        target = target.left;

    }

    //此时,target就时最小节点,此时删除最小节点的值

    delNode(target.val);

    return target.val;

}

//删除节点

public void delNode(int val){

    if (root == null){

        return;

    }else {

        Node targetnode = root.search(val);

        if (targetnode == null ){

            return;

        }

        if (targetnode == root && targetnode.left == null && targetnode.right == null){

            root = null;

            return;

        }

        Node parent = searchParent(targetnode);

        //要删除的节点是叶子节点

        if (targetnode.left == null && targetnode.right == null){

            if (targetnode == parent.left && parent.left != null){

                parent.left = null;

            }else if (parent.right != null && parent.right == targetnode ){

                parent.right = null;

            }

        }

        //删除右两棵子树的节点

        else if (targetnode.left != null && targetnode.right != null){

            int rightTreeMinVal = delRightTreeMin(targetnode.right);//在右子树中找最小值,用来顶替替要删除的节点

            targetnode.val = rightTreeMinVal;//此时将右子树的最小值付给了要删除的节点

        }

        //删除you一棵子树的节点

        else {

            //如果要删除的节点有左子节点

            if (targetnode.left != null) {

                if(parent != null) {

                    //如果要删除的节点是parent的左子节点

                    if (parent.left.val == targetnode.val) {

                        parent.left = targetnode.left;

                    } else {

                        parent.right = targetnode.left;

                    }

                }else {

                    root = targetnode.left;

                }

            }

            //如果眼删除的节点有右子节点

            else {//如果要删除的节点是parent的右子节点

                if (parent != null){

                    if (parent.left.val == targetnode.val){

                        parent.left = targetnode.right;

                    }else {

                        parent.right = targetnode.right;

                    }

                }else {

                    root = parent.right;

                }



            }

        }

    }

}

}

class Node{

int val;

Node left;

Node right;



public Node(int val) {

    this.val = val;

}



@Override

public String toString() {

    return "Node{" +

            "val=" + val +

            '}';

}

//添加节点

public void add(Node node){

    if (node == null){

        return;

    }

    if (node.val > this.val){

       if (this.right == null){

           this.right = node;

       }else {//右递归

           this.right.add(node);

       }

    }else {

        if (this.left == null){

            this.left = node;

        }else {

            this.left.add(node);

        }

    }

}

//中序遍历

public void midOrder(){

    if (this.left != null){

        this.left.midOrder();

    }

    System.out.println(this.val);

    if (this.right != null){

        this.right.midOrder();

    }

}

//查找要删除的节点

public Node search(int val){

    if (this.val == val){

        return this;

    }else if (this.val > val){

        //如果左子节点但为空

        if (this.left != null) {

            return this.left.search(val);

        }

        return null;

    }else {

// 如果右子节点为空,return null;

        if (this.right != null) {

            return this.right.search(val);

        }

        return null;

    }

}

//查找要删除的叶子节点的父节点

public Node searchParent(Node node){

    //如果当前节点是眼删除节点的父节点,直接返回

    if ((this.left != null && this.left.val == node.val) ||

            (this.right != null && this.right.val == node.val)){

        return this;

    }else {

        //如果this的左子节点不为空,并且左子节点的值比node的值大,就this.left.searchParent()向左递归

        if(this.left != null && this.val >= node.val){

            return this.left.searchParent(node);

        }

        //如果this的右子节点不为空,并且右子节点的值比node的值小,就this.right.searchParent()向右递归

        else if (this.right != null && this.val <= node.val){

            return this.right.searchParent(node);

        }else {

            return null;

        }

    }

}

//删除节点

/*

1.删除的叶子节点

    (1).找到要删除节点targetNode和他的父节点parentNode(考虑是否存在父节点)

    (2).判断targetNOde是父节点的左子节点还是右子节点

            a.左子节点:parentNode.left = null;

            b.左子节点:parent.right = null;

 2.删除非叶子节点

    (1).找到targetNode节点

        A.如果targetNode只有左子树

            a.在targetNode的左子树中找到最右叶子节点

            b.最右叶子节点记作rightNode,找到rightNode的父节点parent

            c.定义临时变量temp,temp = rightNode;

            d.parent.right = null;将最右叶子节点删除

            e.将temp节点赋给targetNOde,targetNode = temp;

        B.如果targetNode只有右子树

            a.在targetNode的右子树中找到最左叶子节点

            b.最右叶子节点记作leftNode,找到leftNode的父节点parent

            c.定义临时变量temp,temp = leftNode;

            d.parent.right = null;将最右叶子节点删除

            e.将temp节点赋给targetNOde,targetNode = temp;

        C.如果targetNode有两个子树,重复B,在右子树中照最左叶子节点。

 */

}




运行结果:



![](https://img-blog.csdnimg.cn/dddce8841931479282240cbdd418eea7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2Z5omv,size_20,color_FFFFFF,t_70,g_se,x_16)





## 总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

1.  技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
2.  项目经历:只写明星项目,描述遵循 STAR 法则;
3.  简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

> 以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/109326e71d52bd53ca93847e6254cfb1.webp?x-oss-process=image/format,png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/9fcb0bcfe55531ba2d93fa45959d5b22.webp?x-oss-process=image/format,png)

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/1d33cba3143a134a4c50f65344dc2029.webp?x-oss-process=image/format,png)


了解详情https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB
终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

1.  技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
2.  项目经历:只写明星项目,描述遵循 STAR 法则;
3.  简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

> 以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

[外链图片转存中...(img-ZSNuh1Om-1724091847637)]

[外链图片转存中...(img-wRD4EHzy-1724091847637)]

[外链图片转存中...(img-cXQE63Ob-1724091847638)]


了解详情https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值