数据结构---树-删除节点

一、前言

接着之前的一片博客![数据结构---二叉树(遍历查找)](https://img-blog.csdnimg.cn/18f94818961d473fb9b07fafa8b5ca74.png)

,接着后序写,本来是想重新编辑一下,写成一边博客,但是自我感觉,多写一篇博客会有成就感,哈哈哈哈哈(自恋勿cue)

二、思路

现在我有如下这样的二叉树:
在这里插入图片描述
我现在想删除其中的一个节点,比如2,或者5,有如下思路:
首先自定义删除规则:如果删除的是叶子节点直接删除叶子结点,如果要删除的不是叶子节点,比如:2,索性直接将2的两个左右子节点删除

分析:
要判断当前的root节点(上图的1号节点)是否为空,则输出此树为空树
root节点如果不为空,则判断root节点是否是要删除的节点
如果是,则直接将root节点置空
如果不是,则递归查找删除节点

三、代码

Node.java

    /**
     * 删除节点
     * 自定义删除规则:
     * 如果要删除的是叶子节点,直接删除,如果不是叶子节点,删除当前节点(后续的节点也直接删除,不考虑移动)
     */
    public void delNode(int id) {
        if (this.left != null && this.left.id == id) { // 如果当前节点的左子节点不为空或者当前节点的左子节点就是要删除的节点
            this.left = null; // 删除当前节点的左子节点
            return;
        }
        if (this.right != null && this.right.id == id) { //如果当前节点的右子节点不为空或者当前节点的右子节点就是要删除的节点
            this.right = null;// 删除当前节点的右子节点
            return;
        }

        // 递归查找
        if (this.left != null) {
            this.left.delNode(id);
        }

        // 递归查找
        if (this.right != null) {
            this.right.delNode(id);
        }

    }

BinaryTree.java

    /**
     * 删除节点
     * @param id
     */
    public void delNode(int id) {
        if (this.root == null) {
            System.out.println("当前树为空树");
        } else{
            if (this.root.getId() == id) { // 如果当前节点是要删除的节点
                this.root = null;
            } else {
                this.root.delNode(id);
            }
        }
    }

测试结果
在这里插入图片描述
补充:
如果要把删除节点的后续节点往上提,规定:把要删除节点的左子节点往上提

    public void delNode(int id) {
        if (this.left != null && this.left.id == id) { // 如果当前节点的左子节点不为空或者当前节点的左子节点就是要删除的节点
            Node temp;
            if (this.left.left != null) { // 将要删除节点的左子节点往上提
                temp = this.left.left;
                this.left = temp;
            } else {
                this.left = null; // 删除当前节点的左子节点
            }
            return;
        }
        if (this.right != null && this.right.id == id) { //如果当前节点的右子节点不为空或者当前节点的右子节点就是要删除的节点
            this.right = null;// 删除当前节点的右子节点
            return;
        }

        // 递归查找
        if (this.left != null) {
            this.left.delNode(id);
        }

        // 递归查找
        if (this.right != null) {
            this.right.delNode(id);
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值