二叉樹的節點刪除
二叉樹節點的刪除,大家馬上腦海里就馬上想到的是一顆二叉樹,然后我們要刪除它的葉子節點,刪除的非葉子節點,應該怎么做呢,想到的時候,好像感覺很復雜的樣子。其實我們只要慢慢分析,總是能把他搞出來的。
首先請看我們的分析過程,大概如下圖所示:
這里的大概誤區就是:我們一般刪除,想到的方法就是直接和跟結點進行比較了,然后就開始寫代碼了。其實我們只要仔細分析一下,就會得出上面的結論。
接下來根據上面的分析,得出具體的思路:
代碼如下:
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("刪除失敗"); }