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);
}
}結果如下圖所示:

總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring MVC學習教程之RequestMappingHandlerAdapter詳解
這篇文章主要給大家介紹了關于Spring MVC學習教程之RequestMappingHandlerAdapter的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-11-11
SpringBoot中配置屬性熱更新的輕量級實現(xiàn)方案
項目開發(fā)中,每次修改配置都要重啟服務,不僅開發(fā)效率低,線上重啟還會導致短暫不可用,今天分享一個輕量級方案,基于SpringBoot原生能力實現(xiàn)配置熱更新,有需要的可以了解下2025-07-07
如何在 Java 中利用 redis 實現(xiàn) LBS 服務
基于位置的服務,是指通過電信移動運營商的無線電通訊網(wǎng)絡或外部定位方式,獲取移動終端用戶的位置信息,在GIS平臺的支持下,為用戶提供相應服務的一種增值業(yè)務。下面我們來一起學習一下吧2019-06-06
Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)
下面小編就為大家?guī)硪黄狫ava數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

