二叉樹的節點刪除


  二叉樹的節點刪除

     二叉樹節點的刪除,大家馬上腦海里就馬上想到的是一顆二叉樹,然后我們要刪除它的葉子節點,刪除的非葉子節點,應該怎么做呢,想到的時候,好像感覺很復雜的樣子。其實我們只要慢慢分析,總是能把他搞出來的。

     首先請看我們的分析過程,大概如下圖所示:

    

 

    這里的大概誤區就是:我們一般刪除,想到的方法就是直接和跟結點進行比較了,然后就開始寫代碼了。其實我們只要仔細分析一下,就會得出上面的結論。

    接下來根據上面的分析,得出具體的思路:

    

 

    代碼如下:

    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("刪除失敗");
         }

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM