java有序二叉樹的刪除節(jié)點方式
java有序二叉樹的刪除節(jié)點
刪除節(jié)點時會有三種可能
1、刪除的節(jié)點為葉子節(jié)點
我們?nèi)绻麆h除為葉子節(jié)點,則步驟應該是:
1)先找到要刪除的葉子節(jié)點
2)再找到要刪除節(jié)點的父節(jié)點(考慮是否有父節(jié)點)
3)找到刪除的節(jié)點是父節(jié)點的左子樹還是右子樹
4)根據(jù)前面的情況進行刪除
2、刪除的節(jié)點只有一個子樹
步驟:
1)先找到要刪除的節(jié)點
2)再找到要刪除節(jié)點的父節(jié)點(考慮是否有父節(jié)點)
3)確定刪除的節(jié)點是有左子樹還是有右子樹
4)找到刪除的節(jié)點是父節(jié)點的左子樹還是右子樹
5)根據(jù)前面的情況進行刪除
3、刪除的節(jié)點有兩個子樹
步驟:
1)先找到要刪除的節(jié)點
2)再找到要刪除節(jié)點的父節(jié)點(考慮是否有父節(jié)點)
3)找到刪除節(jié)點右子樹當中最小的或左子樹最大的節(jié)點
4)將3)找到的這個節(jié)點的值替換掉要刪除的節(jié)點的值
5)刪除找到的3)
通過上面步驟它們都有一個共同特點就是需要找到刪除的節(jié)點和要刪除節(jié)點的父節(jié)點,所以我們可以把這兩個找節(jié)點都寫成方法:
找到刪除節(jié)點代碼如下(通過遞歸的方式找到要刪除節(jié)點位置并記錄下來):
//找到要刪除的節(jié)點 public TreeNode searchDelnode(TreeNode node,Integer val) { if(node==null) { return null; } if(node.val==val) { return node; }else if(val>node.val){ if(node.rightNode==null) { return null; } return searchDelnode(node.rightNode, val); }else { if(node.leftNode==null) { return null; } return searchDelnode(node.leftNode, val); } }
找被刪除節(jié)點的父節(jié)點代碼如下所示:
//找到要刪除節(jié)點的父節(jié)點 public TreeNode searchDelpartent(TreeNode node,Integer val) { if(node==null) { return null; } if((node.leftNode!=null&&node.leftNode.val==val)||(node.rightNode!=null&&node.rightNode.val==val)) { return node; }else { if(node.leftNode!=null&&val<node.val) { return searchDelpartent(node.leftNode, val); }else if(node.rightNode!=null&&val>node.val){ return searchDelpartent(node.rightNode, val); }else { return null; } } }
我們可以根據(jù)以上步驟寫刪除方法代碼:
//二叉樹刪除節(jié)點 public void del(TreeNode node,Integer val) { if(node==null) { return; } //1.找到要刪除的節(jié)點 TreeNode targetNode=searchDelnode(node, val); //2.沒有找到要刪除的節(jié)點 if(targetNode==null) { return; } //3.找到要刪除節(jié)點的父節(jié)點 TreeNode parentNode=searchDelpartent(node, val); if(node.rightNode==null&&node.leftNode==null) { root=null; return; } if(parentNode==null&&(targetNode.rightNode!=null||targetNode.leftNode!=null)) { int min=searchRightMin(targetNode.rightNode); targetNode.val=min; return; } if(targetNode.leftNode==null&&targetNode.rightNode==null) { if(parentNode.rightNode!=null&&parentNode.rightNode.val==targetNode.val) { parentNode.rightNode=null; }else if(parentNode.leftNode!=null&&parentNode.leftNode.val==val){ parentNode.leftNode=null; } }else if(targetNode.leftNode!=null&&targetNode.rightNode!=null) { //在刪除節(jié)點由左右兩個子樹時,我們選擇找刪除節(jié)點右子樹的最小值,我們可以寫一個方法,在這個方法里不僅找到最小值,并把這個位置的元素進行刪除 int min=searchRightMin(targetNode.rightNode); targetNode.val=min; }else { if(targetNode.rightNode!=null) { if(parentNode.rightNode.val==targetNode.val) { parentNode.rightNode=targetNode.rightNode; }else { parentNode.leftNode=targetNode.rightNode; } }else{ if(targetNode.rightNode.val==targetNode.val) { parentNode.rightNode=targetNode.leftNode; }else { parentNode.leftNode=targetNode.leftNode; } } } }
在刪除節(jié)點由左右兩個子樹時,我們選擇找刪除節(jié)點右子樹的最小值,我們可以寫一個方法,在這個方法里不僅找到最小值,并把這個位置的元素進行刪除
代碼如下:
public int searchRightMin(TreeNode node) { TreeNode temp=node; while(temp.leftNode!=null) { temp=temp.leftNode; } del(root, temp.val); return temp.val; } }
寫一個測試類進行測試:
public class Test { public static void main(String[] args) { BinaryTree binaryTree=new BinaryTree(); binaryTree.insert(1); binaryTree.insert(2); binaryTree.insert(3); binaryTree.insert(4); binaryTree.insert(5); binaryTree.insertDigui(6, binaryTree.root); binaryTree.insertDigui(7, binaryTree.root); binaryTree.insertDigui(8, binaryTree.root); binaryTree.insertDigui(9, binaryTree.root); binaryTree.del(binaryTree.root, 2); binaryTree.Order(); System.out.println(); binaryTree.startErgodic(binaryTree.root); System.out.println(); binaryTree.midErgodic(binaryTree.root); System.out.println(); binaryTree.endErgodic(binaryTree.root); } }
結(jié)果如下圖所示:
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot啟動mongoDB報錯之禁用mongoDB自動配置問題
這篇文章主要介紹了springboot啟動mongoDB報錯之禁用mongoDB自動配置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05如何利用postman完成JSON串的發(fā)送功能(springboot)
這篇文章主要介紹了如何利用postman完成JSON串的發(fā)送功能(springboot),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Java數(shù)據(jù)結(jié)構之圖的原理與實現(xiàn)
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。本文將詳細介紹圖的原理及其代碼實現(xiàn),需要的可以參考一下2022-01-01Java實現(xiàn)企業(yè)員工管理系統(tǒng)
這篇文章主要為大家詳細介紹了Java實現(xiàn)企業(yè)員工管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02