java有序二叉樹的刪除節(jié)點方式
java有序二叉樹的刪除節(jié)點
刪除節(jié)點時會有三種可能
1、刪除的節(jié)點為葉子節(jié)點
我們?nèi)绻麆h除為葉子節(jié)點,則步驟應(yīng)該是:
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é)點右子樹當(dāng)中最小的或左子樹最大的節(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot啟動mongoDB報錯之禁用mongoDB自動配置問題
這篇文章主要介紹了springboot啟動mongoDB報錯之禁用mongoDB自動配置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
如何利用postman完成JSON串的發(fā)送功能(springboot)
這篇文章主要介紹了如何利用postman完成JSON串的發(fā)送功能(springboot),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Java數(shù)據(jù)結(jié)構(gòu)之圖的原理與實現(xiàn)
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。本文將詳細介紹圖的原理及其代碼實現(xiàn),需要的可以參考一下2022-01-01
Java實現(xiàn)企業(yè)員工管理系統(tǒng)
這篇文章主要為大家詳細介紹了Java實現(xiàn)企業(yè)員工管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

