二叉树删除节点

1)若果删除的节点是叶子节点,则删除该节点
2)如果删除的节点是非叶子节点,则删除该树

思路:
1.如果这个树是空树,如果只有root结点,则等价于将二叉树置空
2.所以,我们是判断当前节点的子结点是否是需要删除的节点,而不能去判断当前这个结点是不是需
要删除的结点
3.如果当前节点的左子结点不为空,并且左子节点就是要删除的结点,就将this.left=null
4.如果当前节点的右子结点不为空,并且右子节点就是要删除的结点,就将this.right=null
5.如果第二步第三步都没有删除结点,我们就需要向左子树进行递归删除
6.如果第四步都没有删除这个结点就向右子树进行递归删除

代码实现

HeroNode中的方法
	//递归删除结点
    //如果删除的结点是叶子结点,则删除该结点
    //如果删除的结点是非叶子结点,则删除该树
    public void delNode(int no){
        //3.如果当前节点的左子结点不为空,并且左子节点就是要删除的结点,就将this.left=null
        if (this.left!=null&&this.left.no==no){
            this.left=null;
            return;
        }
        //4.如果当前节点的右子结点不为空,并且右子节点就是要删除的结点,就将this.right=null
        if (this.right!=null&&this.right.no==no){
            this.right=null;
            return;
        }
        //5.如果第二步第三步都没有删除结点,我们就需要向左子树进行递归删除
        if (this.left!=null){
            this.left.delNode(no);
        }
        //6.如果第四步都没有删除这个结点就向右子树进行递归删除
        if (this.right!=null){
            this.right.delNode(no);
        }

    }

BinaryTree中的代码
	//删除结点
    public void delNode(int no){
        if (root!=null){
            //这里就要立即判断root是不是要删除的结点
            if (root.getNo()==no){
                root=null;
            }else {
                root.delNode(no);
            }
        }else{
            System.out.println("空树不能删除");
        }
    }
    
但是这样删除二叉树,如果删除左边节点还是会在右边节点递归一遍