要求:递归删除节点
1、如果删除的节点是叶子节点,则删除节点
2、如果删除的节点是非叶子节点,则删除该子树
思路:
删除节点前判断树是否为空,如果为空,则不进行操作。如果不为空,则再判断一下二叉树是否只有一个节点,如果是,则直接将二叉树置空。
1、由于二叉树的单向的,因此不是判断当前节点是否是要删除的节点,而是判断当前节点的子节点是否需要删除。
2、如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,则this.left=null,并且返回(结束递归删除)
3、如果当前节点的右子节点不为空,并且右子节点就是要删除的节点,则this.right=null,并且返回(结束递归删除)
4、如果第2、3步都没有删除节点,则对左子树进行递归删除
5、如果第4步也没有删除节点,则对右子树进行递归删除
代码结构为:
heroNode的remove方法代码实现(heroNode):
此方法是在heroNode类中定义的,是heroNode类的类方法
remove()方法接受一个整型变量作为删除的依据,传入的整数的意义是节点的序号,这是每个节点独有的,即不重复。
heroNode类的成员变量如下:
/*
删除节点前判断树是否为空,如果为空,则不进行操作。如果不为空,则再判断一下二叉树是否只有一个节点,如果是,则直接将二叉树置空。
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();
}
}
代码中构建的二叉树为 :
运行结果: