二叉树的节点删除

  二叉树的节点删除

     二叉树节点的删除,大家马上脑海里就马上想到的是一颗二叉树,然后我们要删除它的叶子节点,删除的非叶子节点,应该怎么做呢,想到的时候,好像感觉很复杂的样子。其实我们只要慢慢分析,总是能把他搞出来的。

     首先请看我们的分析过程,大概如下图所示:

    

 

    这里的大概误区就是:我们一般删除,想到的方法就是直接和跟结点进行比较了,然后就开始写代码了。其实我们只要仔细分析一下,就会得出上面的结论。

    接下来根据上面的分析,得出具体的思路:

    

 

    代码如下:

    public static Boolean deleteByNo(HeroNode node,int no){
        if(node.getLeft()!=null){
            if(node.getLeft().getNo()==no){
                node.setLeft(null);
                return true;
            }
        }
        if(node.getRight()!=null){
            if(node.getRight().getNo()==no){
                node.setRight(null);
                return  true;
            }
        }
        if(node.getNo()==no){
            node=null;
            return true;
        }
        Boolean flag=false;
        if(node.getLeft()!=null){
            flag=deleteByNo(node.getLeft(),no);
        }
        if(flag){
            return  flag;
        }
        if(node.getRight()!=null){
            flag=deleteByNo(node.getRight(),no);
        }
        return  flag;
    }

    测试代码如下:

    HeroNode node1=new HeroNode(1,"及时雨","宋江");
        HeroNode node2=new HeroNode(2,"玉麒麟","卢俊义");
        HeroNode node3=new HeroNode(3,"智多星","吴用");
        HeroNode node4=new HeroNode(4,"花和尚","鲁智深");
        HeroNode node5=new HeroNode(5,"豹子头","林冲");
        HeroNode node6=new HeroNode(6,"矮脚虎","王英");

        node1.setLeft(node2);
        node1.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node3.setRight(node6);

        //现在要删除节点3。怎么删除呢。
         Boolean flag=deleteByNo(node1,3);
         if(flag){
             System.out.println("删除成功");
         }else{
             System.out.println("删除失败");
         }

 

    

 

posted @ 2021-01-23 10:18  GDOUJKZZ  阅读(795)  评论(0编辑  收藏  举报