要求:递归删除节点
1、如果删除的节点是叶子节点,则删除节点
2、如果删除的节点是非叶子节点,则删除该子树

思路:
删除节点前判断树是否为空,如果为空,则不进行操作。如果不为空,则再判断一下二叉树是否只有一个节点,如果是,则直接将二叉树置空。

1、由于二叉树的单向的,因此不是判断当前节点是否是要删除的节点,而是判断当前节点的子节点是否需要删除。
2、如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,则this.left=null,并且返回(结束递归删除)
3、如果当前节点的右子节点不为空,并且右子节点就是要删除的节点,则this.right=null,并且返回(结束递归删除)
4、如果第2、3步都没有删除节点,则对左子树进行递归删除
5、如果第4步也没有删除节点,则对右子树进行递归删除

代码结构为:

java 树形节点遍历删除空children java二叉树删除节点_java

heroNode的remove方法代码实现(heroNode):

此方法是在heroNode类中定义的,是heroNode类的类方法

remove()方法接受一个整型变量作为删除的依据,传入的整数的意义是节点的序号,这是每个节点独有的,即不重复。

heroNode类的成员变量如下:

java 树形节点遍历删除空children java二叉树删除节点_数据结构_02


/*
    删除节点前判断树是否为空,如果为空,则不进行操作。如果不为空,则再判断一下二叉树是否只有一个节点,如果是,则直接将二叉树置空。

    1、由于二叉树的单向的,因此不是判断当前节点是否是要删除的节点,而是判断当前节点的子节点是否需要删除。
    2、如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,则this.left=null,并且返回(结束递归删除)
    3、如果当前节点的右子节点不为空,并且右子节点就是要删除的节点,则this.right=null,并且返回(结束递归删除)
    4、如果第2、3步都没有删除节点,则对左子树进行递归删除
    5、如果第4步也没有删除节点,则对右子树进行递归删除
     */
    public void remove(int no)
    {

        //2、如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,则this.left=null,并且返回(结束递归删除)
        if(this.left!=null && this.left.no==no)
        {
            this.left=null;
            return;
        }
        //3、如果当前节点的右子节点不为空,并且右子节点就是要删除的节点,则this.right=null,并且返回(结束递归删除)
        if(this.right!=null && this.right.no==no)
        {
            this.right=null;
            return;
        }
        //4、如果第2、3步都没有删除节点,则对左子树进行递归删除
        if(this.left!=null)
        {
            this.left.remove(no);
            //注意,在这里不能返回return,因为可能左子树并没有删除元素,此时还需要访问右子树
        }
        //5、如果第4步也没有删除节点,则对右子树进行递归删除
        if(this.right!=null)
        {
            this.right.remove(no);
        }
        return;
    }

同时在类binaryTree中实现(binaryTree):

删除节点前判断树是否为空,如果为空,则不进行操作。如果不为空,则再判断一下二叉树是否只有一个节点,如果是并且此节点就是要删除的节点,则直接将二叉树置空。

public void remove(int no)
    {
        if(this.root==null)
            return;
        //this.root.remove(no);
        if(this.getRoot().getNo()==no)
        {
            this.root=null;
        }
        else
        {
        	//开始递归实现左右子树的删除操作,即1-5步
            this.root.remove(no);
        }
    }

示例代码(BinaryTreeDemo):

package BinaryTree;

public class BinaryTreeDemo {
    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();

        heroNode node1=new heroNode(1,"宋江");
        heroNode node2=new heroNode(2,"吴用");
        heroNode node3=new heroNode(3,"卢俊义");
        heroNode node4=new heroNode(4,"林冲");

        binaryTree.setRoot(node1);
        //手动创建二叉树
        node1.setLeft(node2);
        node1.setRight(node3);
        node3.setRight(node4);
        node3.setLeft(new heroNode(5,"关胜"));


        int pos4=4;
        System.out.println("删除节点前的前序遍历为:");
        binaryTree.preOrder();
        System.out.println("删除的节点为:"+pos4);
        System.out.println("删除节点后的前序遍历为:");
        binaryTree.remove(pos4);
        if(binaryTree.getRoot()!=null)
            binaryTree.getRoot().preOrder();
    }
}

代码中构建的二叉树为 :

java 树形节点遍历删除空children java二叉树删除节点_删除节点_03

运行结果:

java 树形节点遍历删除空children java二叉树删除节点_java_04